From 665d2ec5af6e8a97461df7dbc31e5540464ad6fb Mon Sep 17 00:00:00 2001 From: nohar Date: Thu, 28 Apr 2005 08:26:44 +0000 Subject: [PATCH] Initial import --- AUTHORS | 6 + COPYING | 340 ++ ChangeLog | 4 + IDEAS | 14 + INSTALL | 182 + Makefile.am | 1 + Makefile.in | 357 ++ NEWS | 0 README | 2 + TODO | 9 + aclocal.m4 | 987 ++++ autom4te.cache/output.0 | 4256 +++++++++++++++++ autom4te.cache/requests | 116 + autom4te.cache/traces.0 | 135 + config.guess | 1465 ++++++ config.sub | 1569 ++++++ configure | 4256 +++++++++++++++++ configure.in | 19 + debian/bip.substvars | 1 + debian/bip/DEBIAN/control | 14 + debian/bip/DEBIAN/md5sums | 9 + debian/bip/usr/bin/bip | Bin 0 -> 89144 bytes debian/bip/usr/bin/genpwent | Bin 0 -> 14352 bytes debian/bip/usr/share/bip/bip.conf | 122 + debian/bip/usr/share/bip/bip.vim | 135 + debian/bip/usr/share/doc/bip/AUTHORS | 6 + debian/bip/usr/share/doc/bip/README | 2 + debian/bip/usr/share/doc/bip/TODO | 9 + .../bip/usr/share/doc/bip/changelog.Debian.gz | Bin 0 -> 159 bytes debian/bip/usr/share/doc/bip/changelog.gz | Bin 0 -> 126 bytes debian/changelog | 5 + debian/compat | 1 + debian/control | 16 + debian/files | 1 + debian/rules | 4 + debian/stamp-autotools-files | 0 debian/stamp-makefile-build | 0 install-sh | 269 ++ missing | 198 + mkinstalldirs | 40 + samples/Makefile.am | 2 + samples/Makefile.in | 202 + samples/bip.conf | 122 + samples/bip.vim | 135 + src/Makefile.am | 5 + src/Makefile.in | 375 ++ src/bip.c | 981 ++++ src/bip.h | 59 + src/conf.c | 1753 +++++++ src/conf.h | 140 + src/conf.y | 190 + src/config.h.in | 29 + src/connection.c | 1279 +++++ src/connection.h | 97 + src/genpwent.c | 37 + src/irc.c | 2067 ++++++++ src/irc.h | 180 + src/lex.c | 2065 ++++++++ src/lex.l | 95 + src/line.c | 174 + src/line.h | 74 + src/log.c | 870 ++++ src/log.h | 87 + src/md5.c | 418 ++ src/md5.h | 23 + src/stamp-h.in | 1 + src/tuple.h | 27 + src/util.c | 631 +++ src/util.h | 103 + stamp-h.in | 1 + 70 files changed, 26772 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 IDEAS create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 README create mode 100644 TODO create mode 100644 aclocal.m4 create mode 100644 autom4te.cache/output.0 create mode 100644 autom4te.cache/requests create mode 100644 autom4te.cache/traces.0 create mode 100755 config.guess create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100644 debian/bip.substvars create mode 100644 debian/bip/DEBIAN/control create mode 100644 debian/bip/DEBIAN/md5sums create mode 100755 debian/bip/usr/bin/bip create mode 100755 debian/bip/usr/bin/genpwent create mode 100644 debian/bip/usr/share/bip/bip.conf create mode 100644 debian/bip/usr/share/bip/bip.vim create mode 100644 debian/bip/usr/share/doc/bip/AUTHORS create mode 100644 debian/bip/usr/share/doc/bip/README create mode 100644 debian/bip/usr/share/doc/bip/TODO create mode 100644 debian/bip/usr/share/doc/bip/changelog.Debian.gz create mode 100644 debian/bip/usr/share/doc/bip/changelog.gz create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/files create mode 100755 debian/rules create mode 100644 debian/stamp-autotools-files create mode 100644 debian/stamp-makefile-build create mode 100755 install-sh create mode 100755 missing create mode 100755 mkinstalldirs create mode 100644 samples/Makefile.am create mode 100644 samples/Makefile.in create mode 100644 samples/bip.conf create mode 100644 samples/bip.vim create mode 100644 src/Makefile.am create mode 100644 src/Makefile.in create mode 100644 src/bip.c create mode 100644 src/bip.h create mode 100644 src/conf.c create mode 100644 src/conf.h create mode 100644 src/conf.y create mode 100644 src/config.h.in create mode 100644 src/connection.c create mode 100644 src/connection.h create mode 100644 src/genpwent.c create mode 100644 src/irc.c create mode 100644 src/irc.h create mode 100644 src/lex.c create mode 100644 src/lex.l create mode 100644 src/line.c create mode 100644 src/line.h create mode 100644 src/log.c create mode 100644 src/log.h create mode 100644 src/md5.c create mode 100644 src/md5.h create mode 100644 src/stamp-h.in create mode 100644 src/tuple.h create mode 100644 src/util.c create mode 100644 src/util.h create mode 100644 stamp-h.in diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..d579fa2 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,6 @@ +Arnaud 'nohar' Cornet +Loïc 'Kyoshiro' Gomez + +Thanks to jj, YS and lafounie, for hanging around while we were coding. + +Crypto shamelessly taken from Christophe 'sexy' Devine. diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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..81640fb --- /dev/null +++ b/ChangeLog @@ -0,0 +1,4 @@ +2005-04-21 Arnaud Cornet + + * src: Now use autoconf/automake + bip is now public :) diff --git a/IDEAS b/IDEAS new file mode 100644 index 0000000..dfe427d --- /dev/null +++ b/IDEAS @@ -0,0 +1,14 @@ +- parser limité aux join part mode kick kill privmsg notices quit nick names +- parser client : join, part, quit, nick, privmsg/notice +- gestion des chans avec liste des nicks et statut +- backlog avec timestamp à la reconnexion +- logs au format irssi + timestamp complet +- parser de conf (lex) du style var = value +- backlog dans un dir, plusieurs fichiers (un par chan + le reste dans un autre) +- [secondaire] rotate logs + +- connection.c: conn, read/write polls, waitevent, ssl transparent et anti flood +- irc.c: gestion des chans, des spécificités d'un client IRC (ping) +- log.c: log et backlog +- client.c: gestion des clients (auth, etc...) +- config.c: lecture et enregistrement de la conf diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..b42a17a --- /dev/null +++ b/INSTALL @@ -0,0 +1,182 @@ +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, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + 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 at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' 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. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +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 supports 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' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' 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' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +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 host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +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. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--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. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..2b3758a --- /dev/null +++ b/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src samples diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..07c73cd --- /dev/null +++ b/Makefile.in @@ -0,0 +1,357 @@ +# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999, 2001 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. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = . + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +CC = @CC@ +HAVE_LIB = @HAVE_LIB@ +LEX = @LEX@ +LIB = @LIB@ +LTLIB = @LTLIB@ +MAKEINFO = @MAKEINFO@ +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ +YACC = @YACC@ + +SUBDIRS = src samples +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ./src/config.h +CONFIG_CLEAN_FILES = +DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \ +Makefile.in NEWS TODO aclocal.m4 config.guess config.sub configure \ +configure.in install-sh missing mkinstalldirs src/config.h.in \ +src/stamp-h.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) + cd $(top_builddir) \ + && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +$(ACLOCAL_M4): configure.in + cd $(srcdir) && $(ACLOCAL) + +config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) + cd $(srcdir) && $(AUTOCONF) + +src/config.h: src/stamp-h + @if test ! -f $@; then \ + rm -f src/stamp-h; \ + $(MAKE) src/stamp-h; \ + else :; fi +src/stamp-h: $(srcdir)/src/config.h.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES= CONFIG_HEADERS=src/config.h \ + $(SHELL) ./config.status + @echo timestamp > src/stamp-h 2> /dev/null +$(srcdir)/src/config.h.in: $(srcdir)/src/stamp-h.in + @if test ! -f $@; then \ + rm -f $(srcdir)/src/stamp-h.in; \ + $(MAKE) $(srcdir)/src/stamp-h.in; \ + else :; fi +$(srcdir)/src/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOHEADER) + @echo timestamp > $(srcdir)/src/stamp-h.in 2> /dev/null + +mostlyclean-hdr: + +clean-hdr: + +distclean-hdr: + -rm -f src/config.h + +maintainer-clean-hdr: + +# 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. + +@SET_MAKE@ + +all-recursive install-data-recursive install-exec-recursive \ +installdirs-recursive install-recursive uninstall-recursive \ +check-recursive installcheck-recursive info-recursive dvi-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ + test "$$subdir" != "." || dot_seen=yes; \ + done; \ + test "$$dot_seen" = "no" && rev=". $$rev"; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags -o $$here/TAGS $(ETAGS_ARGS) $$tags $$unique $(LISP)) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(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 + -rm -rf $(distdir) + GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz + mkdir $(distdir)/=build + mkdir $(distdir)/=inst + dc_install_base=`cd $(distdir)/=inst && pwd`; \ + cd $(distdir)/=build \ + && ../configure --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) dist + -rm -rf $(distdir) + @banner="$(distdir).tar.gz is ready for distribution"; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes" +dist: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +dist-all: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +distdir: $(DISTFILES) + -rm -rf $(distdir) + mkdir $(distdir) + -chmod 777 $(distdir) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(distdir) && pwd`; \ + distdir=`cd $(distdir) && pwd`; \ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done +info-am: +info: info-recursive +dvi-am: +dvi: dvi-recursive +check-am: all-am +check: check-recursive +installcheck-am: +installcheck: installcheck-recursive +install-exec-am: +install-exec: install-exec-recursive + +install-data-am: +install-data: install-data-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-recursive +uninstall-am: +uninstall: uninstall-recursive +all-am: Makefile +all-redirect: all-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: installdirs-recursive +installdirs-am: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-hdr mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-recursive + +clean-am: clean-hdr clean-tags clean-generic mostlyclean-am + +clean: clean-recursive + +distclean-am: distclean-hdr distclean-tags distclean-generic clean-am + +distclean: distclean-recursive + -rm -f config.status + +maintainer-clean-am: maintainer-clean-hdr maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-recursive + -rm -f config.status + +.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ +install-data-recursive uninstall-data-recursive install-exec-recursive \ +uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ +all-recursive check-recursive installcheck-recursive info-recursive \ +dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ +install-exec install-data-am install-data install-am install \ +uninstall-am uninstall all-redirect all-am all installdirs-am \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..3be0aa0 --- /dev/null +++ b/README @@ -0,0 +1,2 @@ +log encryption support +salt this md5 diff --git a/TODO b/TODO new file mode 100644 index 0000000..b0f5b98 --- /dev/null +++ b/TODO @@ -0,0 +1,9 @@ +- SSL certificate verification +- allowed IP filtering +- multi user (user/pass to identify user + realname to id. network) +- keep invites when detached +- DCC proxying ? +- /bip command, for admin (rehash, jump, ...) +- crypt logs + +tidy up irc_server/server structures diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..b5f1712 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,987 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4-p6 + +dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +# lib-prefix.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) + +# lib-link.m4 serial 4 (gettext-0.12) +dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) + +# lib-ld.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + 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. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) + +# Like AC_CONFIG_HEADER, but automatically create stamp file. + +AC_DEFUN([AM_CONFIG_HEADER], +[AC_PREREQ([2.12]) +AC_CONFIG_HEADER([$1]) +dnl When config.status generates a header, we must update the stamp-h file. +dnl This file resides in the same directory as the config header +dnl that is generated. We must strip everything past the first ":", +dnl and everything past the last "/". +AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl +ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, +<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, +<>; do + case " <<$>>CONFIG_HEADERS " in + *" <<$>>am_file "*<<)>> + echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx + ;; + esac + am_indx=`expr "<<$>>am_indx" + 1` +done<<>>dnl>>) +changequote([,]))]) + +# Do all the work for Automake. 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. + +# serial 1 + +dnl Usage: +dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL]) +PACKAGE=[$1] +AC_SUBST(PACKAGE) +VERSION=[$2] +AC_SUBST(VERSION) +dnl test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi +ifelse([$3],, +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) +AC_REQUIRE([AM_SANITY_CHECK]) +AC_REQUIRE([AC_ARG_PROGRAM]) +dnl FIXME This is truly gross. +missing_dir=`cd $ac_aux_dir && pwd` +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}, $missing_dir) +AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}, $missing_dir) +AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) +AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) +AC_REQUIRE([AC_PROG_MAKE_SET])]) + +# Copyright 2002 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + +# 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. +AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.4"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.4-p6])]) + +# +# Check to make sure that the build environment is sane. +# + +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "[$]*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "[$]*" != "X $srcdir/configure conftestfile" \ + && test "[$]*" != "X conftestfile $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 + + test "[$]2" = conftestfile + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +rm -f conftest* +AC_MSG_RESULT(yes)]) + +dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) +dnl The program must properly implement --version. +AC_DEFUN([AM_MISSING_PROG], +[AC_MSG_CHECKING(for working $2) +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if ($2 --version) < /dev/null > /dev/null 2>&1; then + $1=$2 + AC_MSG_RESULT(found) +else + $1="$3/missing $2" + AC_MSG_RESULT(missing) +fi +AC_SUBST($1)]) + + +dnl AM_PROG_LEX +dnl Look for flex, lex or missing, then run AC_PROG_LEX and AC_DECL_YYTEXT +AC_DEFUN([AM_PROG_LEX], +[missing_dir=ifelse([$1],,`cd $ac_aux_dir && pwd`,$1) +AC_CHECK_PROGS(LEX, flex lex, $missing_dir/missing flex) +AC_PROG_LEX +AC_DECL_YYTEXT]) + diff --git a/autom4te.cache/output.0 b/autom4te.cache/output.0 new file mode 100644 index 0000000..52f040c --- /dev/null +++ b/autom4te.cache/output.0 @@ -0,0 +1,4256 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.59. +@%:@ +@%:@ Copyright (C) 2003 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 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# 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'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="src/bip.c" +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT YACC LEX LEXLIB LEX_OUTPUT_ROOT LIB@&t@OBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# 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. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +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 + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -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 | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$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 ;; + + -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 ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + 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 ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=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 ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + 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'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +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 + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# 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 its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + 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 + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS + +# +# 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 this package 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 \`..'] + +_ACEOF + + cat <<_ACEOF +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] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_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 +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-ssl Drop OpenSSL support + +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 + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style 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 + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd "$ac_popdir" + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright (C) 2003 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 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +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` +hostinfo = `(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=. + echo "PATH: $as_dir" +done + +} >&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_sep= +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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +@%:@@%:@ ---------------- @%:@@%:@ +@%:@@%:@ Cache variables. @%:@@%:@ +@%:@@%:@ ---------------- @%:@@%:@ +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +@%:@@%:@ ----------------- @%:@@%:@ +@%:@@%:@ Output variables. @%:@@%:@ +@%:@@%:@ ----------------- @%:@@%:@ +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +@%:@@%:@ ------------- @%:@@%:@ +@%:@@%:@ Output files. @%:@@%:@ +@%:@@%:@ ------------- @%:@@%:@ +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +@%:@@%:@ ----------- @%:@@%:@ +@%:@@%:@ confdefs.h. @%:@@%:@ +@%:@@%:@ ----------- @%:@@%:@ +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >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 + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +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 `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +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 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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_config_headers="$ac_config_headers src/config.h" + + ac_config_commands="$ac_config_commands default-1" + +am__api_version="1.4" +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# 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. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_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 + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +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. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$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' + +echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "$*" != "X $srcdir/configure conftestfile" \ + && test "$*" != "X conftestfile $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". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftestfile + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +rm -f conftest* +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + +PACKAGE=bip + +VERSION=0.0 + +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define VERSION "$VERSION" +_ACEOF + + + +missing_dir=`cd $ac_aux_dir && pwd` +echo "$as_me:$LINENO: checking for working aclocal-${am__api_version}" >&5 +echo $ECHO_N "checking for working aclocal-${am__api_version}... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (aclocal-${am__api_version} --version) < /dev/null > /dev/null 2>&1; then + ACLOCAL=aclocal-${am__api_version} + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + ACLOCAL="$missing_dir/missing aclocal-${am__api_version}" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working autoconf" >&5 +echo $ECHO_N "checking for working autoconf... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoconf --version) < /dev/null > /dev/null 2>&1; then + AUTOCONF=autoconf + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + AUTOCONF="$missing_dir/missing autoconf" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working automake-${am__api_version}" >&5 +echo $ECHO_N "checking for working automake-${am__api_version}... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (automake-${am__api_version} --version) < /dev/null > /dev/null 2>&1; then + AUTOMAKE=automake-${am__api_version} + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + AUTOMAKE="$missing_dir/missing automake-${am__api_version}" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working autoheader" >&5 +echo $ECHO_N "checking for working autoheader... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoheader --version) < /dev/null > /dev/null 2>&1; then + AUTOHEADER=autoheader + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + AUTOHEADER="$missing_dir/missing autoheader" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working makeinfo" >&5 +echo $ECHO_N "checking for working makeinfo... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (makeinfo --version) < /dev/null > /dev/null 2>&1; then + MAKEINFO=makeinfo + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + MAKEINFO="$missing_dir/missing makeinfo" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&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 +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_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" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +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 + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + 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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out 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. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$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 +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 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 -std1. */ +int osf4_cc_array ['\x00' == 0 ? 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 +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +@%:@ifndef __cplusplus + choke me +@%:@endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +@%:@include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext 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 + +# 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. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_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 + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +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. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$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' + +for ac_prog in 'bison -y' byacc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_YACC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$YACC"; then + ac_cv_prog_YACC="$YACC" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_YACC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +YACC=$ac_cv_prog_YACC +if test -n "$YACC"; then + echo "$as_me:$LINENO: result: $YACC" >&5 +echo "${ECHO_T}$YACC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$YACC" && break +done +test -n "$YACC" || YACC="yacc" + + +missing_dir=`cd $ac_aux_dir && pwd` +for ac_prog in flex lex +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LEX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LEX"; then + ac_cv_prog_LEX="$LEX" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LEX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LEX=$ac_cv_prog_LEX +if test -n "$LEX"; then + echo "$as_me:$LINENO: result: $LEX" >&5 +echo "${ECHO_T}$LEX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LEX" && break +done +test -n "$LEX" || LEX="$missing_dir/missing flex" + +for ac_prog in flex lex +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LEX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LEX"; then + ac_cv_prog_LEX="$LEX" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LEX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LEX=$ac_cv_prog_LEX +if test -n "$LEX"; then + echo "$as_me:$LINENO: result: $LEX" >&5 +echo "${ECHO_T}$LEX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LEX" && break +done +test -n "$LEX" || LEX=":" + +if test -z "$LEXLIB" +then + echo "$as_me:$LINENO: checking for yywrap in -lfl" >&5 +echo $ECHO_N "checking for yywrap in -lfl... $ECHO_C" >&6 +if test "${ac_cv_lib_fl_yywrap+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char yywrap (); +int +main () +{ +yywrap (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_fl_yywrap=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_fl_yywrap=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_fl_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_fl_yywrap" >&6 +if test $ac_cv_lib_fl_yywrap = yes; then + LEXLIB="-lfl" +else + echo "$as_me:$LINENO: checking for yywrap in -ll" >&5 +echo $ECHO_N "checking for yywrap in -ll... $ECHO_C" >&6 +if test "${ac_cv_lib_l_yywrap+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ll $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char yywrap (); +int +main () +{ +yywrap (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_l_yywrap=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_l_yywrap=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_l_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_l_yywrap" >&6 +if test $ac_cv_lib_l_yywrap = yes; then + LEXLIB="-ll" +fi + +fi + +fi + +if test "x$LEX" != "x:"; then + echo "$as_me:$LINENO: checking lex output file root" >&5 +echo $ECHO_N "checking lex output file root... $ECHO_C" >&6 +if test "${ac_cv_prog_lex_root+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # The minimal lex program is just a single line: %%. But some broken lexes +# (Solaris, I think it was) want two %% lines, so accommodate them. +cat >conftest.l <<_ACEOF +%% +%% +_ACEOF +{ (eval echo "$as_me:$LINENO: \"$LEX conftest.l\"") >&5 + (eval $LEX conftest.l) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +if test -f lex.yy.c; then + ac_cv_prog_lex_root=lex.yy +elif test -f lexyy.c; then + ac_cv_prog_lex_root=lexyy +else + { { echo "$as_me:$LINENO: error: cannot find output from $LEX; giving up" >&5 +echo "$as_me: error: cannot find output from $LEX; giving up" >&2;} + { (exit 1); exit 1; }; } +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_root" >&6 +rm -f conftest.l +LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root + +echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5 +echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6 +if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # POSIX says lex can declare yytext either as a pointer or an array; the +# default is implementation-dependent. Figure out which it is, since +# not all implementations provide the %pointer and %array declarations. +ac_cv_prog_lex_yytext_pointer=no +echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c +ac_save_LIBS=$LIBS +LIBS="$LIBS $LEXLIB" +cat >conftest.$ac_ext <<_ACEOF +`cat $LEX_OUTPUT_ROOT.c` +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_lex_yytext_pointer=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_save_LIBS +rm -f "${LEX_OUTPUT_ROOT}.c" + +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6 +if test $ac_cv_prog_lex_yytext_pointer = yes; then + +cat >>confdefs.h <<\_ACEOF +@%:@define YYTEXT_POINTER 1 +_ACEOF + +fi + +fi + + +requires_libssl=yes +# Check whether --enable-ssl or --disable-ssl was given. +if test "${enable_ssl+set}" = set; then + enableval="$enable_ssl" + requires_libssl=no +fi; +if test "x$requires_libssl" = "xyes" ; then + +echo "$as_me:$LINENO: checking for SSL_read in -lssl" >&5 +echo $ECHO_N "checking for SSL_read in -lssl... $ECHO_C" >&6 +if test "${ac_cv_lib_ssl_SSL_read+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lssl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char SSL_read (); +int +main () +{ +SSL_read (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ssl_SSL_read=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ssl_SSL_read=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ssl_SSL_read" >&5 +echo "${ECHO_T}$ac_cv_lib_ssl_SSL_read" >&6 +if test $ac_cv_lib_ssl_SSL_read = yes; then + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBSSL 1 +_ACEOF + + LIBS="-lssl $LIBS" + +else + + echo "Error! You need to have libssl around." + exit -1 + +fi + +fi + ac_config_files="$ac_config_files Makefile src/Makefile samples/Makefile" +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, don't put newlines in cache variables' values. +# 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. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *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 \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + 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}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# 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'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -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 + --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_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2003 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + 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 +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS section. +# + + + +_ACEOF + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "samples/Makefile" ) CONFIG_FILES="$CONFIG_FILES samples/Makefile" ;; + "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "src/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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 to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@VERSION@,$VERSION,;t t +s,@ACLOCAL@,$ACLOCAL,;t t +s,@AUTOCONF@,$AUTOCONF,;t t +s,@AUTOMAKE@,$AUTOMAKE,;t t +s,@AUTOHEADER@,$AUTOHEADER,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@YACC@,$YACC,;t t +s,@LEX@,$LEX,;t t +s,@LEXLIB@,$LEXLIB,;t t +s,@LEX_OUTPUT_ROOT@,$LEX_OUTPUT_ROOT,;t t +s,@LIB@&t@OBJS@,$LIB@&t@OBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + # 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. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + # Do quote $f, to prevent DOS paths from being IFS'd. + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +_ACEOF + +# Transform confdefs.h into two sed scripts, `conftest.defines' and +# `conftest.undefs', that substitutes the proper values into +# config.h.in to produce config.h. The first handles `#define' +# templates, and the second `#undef' templates. +# And first: Protect against being on the right side of a sed subst in +# config.status. Protect against being in an unquoted here document +# in config.status. +rm -f conftest.defines conftest.undefs +# Using a here document instead of a string reduces the quoting nightmare. +# Putting comments in sed scripts is not portable. +# +# `end' is used to avoid that the second main sed command (meant for +# 0-ary CPP macros) applies to n-ary macro definitions. +# See the Autoconf documentation for `clear'. +cat >confdef2sed.sed <<\_ACEOF +s/[\\&,]/\\&/g +s,[\\$`],\\&,g +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +t end +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +: end +_ACEOF +# If some macros were called several times there might be several times +# the same #defines, which is useless. Nevertheless, we may not want to +# sort them, since we want the *last* AC-DEFINE to be honored. +uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines +sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs +rm -f confdef2sed.sed + +# This sed command replaces #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. +cat >>conftest.undefs <<\_ACEOF +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +_ACEOF + +# Break up conftest.defines because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS +echo ' :' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.defines >/dev/null +do + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/defines.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines +echo ' fi # grep' >>$CONFIG_STATUS +echo >>$CONFIG_STATUS + +# Break up conftest.undefs because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #undef templates' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.undefs >/dev/null +do + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/undefs.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail + rm -f conftest.undefs + mv conftest.tail conftest.undefs +done +rm -f conftest.undefs + +cat >>$CONFIG_STATUS <<\_ACEOF + # 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. */ + if test x"$ac_file" = x-; then + echo "/* Generated by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || +$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 +echo "$as_me: executing $ac_dest commands" >&6;} + case $ac_dest in + default-1 ) test -z "$CONFIG_HEADERS" || echo timestamp > src/stamp-h ;; + esac +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# 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 || { (exit 1); exit 1; } +fi + diff --git a/autom4te.cache/requests b/autom4te.cache/requests new file mode 100644 index 0000000..1fb2b3d --- /dev/null +++ b/autom4te.cache/requests @@ -0,0 +1,116 @@ +# This file was generated by Autom4te Thu Apr 14 05:08:07 UTC 2005. +# It contains the lists of macros which have been traced. +# It can be safely removed. + +@request = ( + bless( [ + '0', + 1, + [ + '/usr/share/autoconf' + ], + [ + '/usr/share/autoconf/autoconf/autoconf.m4f', + 'aclocal.m4', + 'configure.in' + ], + { + 'm4_pattern_forbid' => 1, + 'AC_CONFIG_LIBOBJ_DIR' => 1, + 'AC_C_VOLATILE' => 1, + 'AC_TYPE_OFF_T' => 1, + 'AC_FUNC_CLOSEDIR_VOID' => 1, + 'AC_REPLACE_FNMATCH' => 1, + 'AC_PROG_LIBTOOL' => 1, + 'AC_FUNC_STAT' => 1, + 'AC_FUNC_WAIT3' => 1, + 'AC_HEADER_TIME' => 1, + 'AC_FUNC_LSTAT' => 1, + 'AC_STRUCT_TM' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'AC_FUNC_GETMNTENT' => 1, + 'AC_TYPE_MODE_T' => 1, + 'AC_FUNC_STRTOD' => 1, + 'AC_CHECK_HEADERS' => 1, + 'AC_FUNC_STRNLEN' => 1, + 'm4_sinclude' => 1, + 'AC_PROG_CXX' => 1, + 'AC_PATH_X' => 1, + 'AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK' => 1, + 'AC_PROG_AWK' => 1, + '_m4_warn' => 1, + 'AC_HEADER_STDC' => 1, + 'AC_HEADER_MAJOR' => 1, + 'AC_FUNC_ERROR_AT_LINE' => 1, + 'AC_PROG_GCC_TRADITIONAL' => 1, + 'AC_LIBSOURCE' => 1, + 'AC_FUNC_MBRTOWC' => 1, + 'AC_STRUCT_ST_BLOCKS' => 1, + 'AC_TYPE_SIGNAL' => 1, + 'AC_TYPE_UID_T' => 1, + 'AC_PROG_MAKE_SET' => 1, + 'AC_CONFIG_AUX_DIR' => 1, + 'm4_pattern_allow' => 1, + 'sinclude' => 1, + 'AC_DEFINE_TRACE_LITERAL' => 1, + 'AC_FUNC_STRERROR_R' => 1, + 'AC_PROG_CC' => 1, + 'AC_DECL_SYS_SIGLIST' => 1, + 'AC_FUNC_FORK' => 1, + 'AC_FUNC_STRCOLL' => 1, + 'AC_FUNC_VPRINTF' => 1, + 'AC_PROG_YACC' => 1, + 'AC_INIT' => 1, + 'AC_STRUCT_TIMEZONE' => 1, + 'AC_FUNC_CHOWN' => 1, + 'AC_SUBST' => 1, + 'AC_FUNC_ALLOCA' => 1, + 'AC_CANONICAL_HOST' => 1, + 'AC_FUNC_GETPGRP' => 1, + 'AC_PROG_RANLIB' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'AC_FUNC_SETPGRP' => 1, + 'AC_CONFIG_SUBDIRS' => 1, + 'AC_FUNC_MMAP' => 1, + 'AC_FUNC_REALLOC' => 1, + 'AC_TYPE_SIZE_T' => 1, + 'AC_CONFIG_LINKS' => 1, + 'AC_CHECK_TYPES' => 1, + 'AC_CHECK_MEMBERS' => 1, + 'AM_MAINTAINER_MODE' => 1, + 'AC_FUNC_UTIME_NULL' => 1, + 'AC_FUNC_SELECT_ARGTYPES' => 1, + 'AC_HEADER_STAT' => 1, + 'AC_FUNC_STRFTIME' => 1, + 'AC_PROG_CPP' => 1, + 'AC_C_INLINE' => 1, + 'AC_PROG_LEX' => 1, + 'AC_C_CONST' => 1, + 'AC_TYPE_PID_T' => 1, + 'AC_CONFIG_FILES' => 1, + 'include' => 1, + 'AC_FUNC_SETVBUF_REVERSED' => 1, + 'AC_PROG_INSTALL' => 1, + 'AM_GNU_GETTEXT' => 1, + 'AC_CHECK_LIB' => 1, + 'AC_FUNC_OBSTACK' => 1, + 'AC_FUNC_MALLOC' => 1, + 'AC_FUNC_GETGROUPS' => 1, + 'AC_FUNC_GETLOADAVG' => 1, + 'AH_OUTPUT' => 1, + 'AC_FUNC_FSEEKO' => 1, + 'AM_PROG_CC_C_O' => 1, + 'AC_FUNC_MKTIME' => 1, + 'AC_CANONICAL_SYSTEM' => 1, + 'AM_CONDITIONAL' => 1, + 'AC_CONFIG_HEADERS' => 1, + 'AC_HEADER_SYS_WAIT' => 1, + 'AC_PROG_LN_S' => 1, + 'AC_FUNC_MEMCMP' => 1, + 'm4_include' => 1, + 'AC_HEADER_DIRENT' => 1, + 'AC_CHECK_FUNCS' => 1 + } + ], 'Autom4te::Request' ) + ); + diff --git a/autom4te.cache/traces.0 b/autom4te.cache/traces.0 new file mode 100644 index 0000000..06e39ce --- /dev/null +++ b/autom4te.cache/traces.0 @@ -0,0 +1,135 @@ +m4trace:configure.in:1: -1- AC_INIT([src/bip.c]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.in:1: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.in:1: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.in:1: -1- AC_SUBST([SHELL], [${CONFIG_SHELL-/bin/sh}]) +m4trace:configure.in:1: -1- AC_SUBST([PATH_SEPARATOR]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) +m4trace:configure.in:1: -1- AC_SUBST([exec_prefix], [NONE]) +m4trace:configure.in:1: -1- AC_SUBST([prefix], [NONE]) +m4trace:configure.in:1: -1- AC_SUBST([program_transform_name], [s,x,x,]) +m4trace:configure.in:1: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) +m4trace:configure.in:1: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) +m4trace:configure.in:1: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) +m4trace:configure.in:1: -1- AC_SUBST([datadir], ['${prefix}/share']) +m4trace:configure.in:1: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) +m4trace:configure.in:1: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) +m4trace:configure.in:1: -1- AC_SUBST([localstatedir], ['${prefix}/var']) +m4trace:configure.in:1: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) +m4trace:configure.in:1: -1- AC_SUBST([includedir], ['${prefix}/include']) +m4trace:configure.in:1: -1- AC_SUBST([oldincludedir], ['/usr/include']) +m4trace:configure.in:1: -1- AC_SUBST([infodir], ['${prefix}/info']) +m4trace:configure.in:1: -1- AC_SUBST([mandir], ['${prefix}/man']) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ +#undef PACKAGE_NAME]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ +#undef PACKAGE_VERSION]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT]) +m4trace:configure.in:1: -1- AC_SUBST([build_alias]) +m4trace:configure.in:1: -1- AC_SUBST([host_alias]) +m4trace:configure.in:1: -1- AC_SUBST([target_alias]) +m4trace:configure.in:1: -1- AC_SUBST([DEFS]) +m4trace:configure.in:1: -1- AC_SUBST([ECHO_C]) +m4trace:configure.in:1: -1- AC_SUBST([ECHO_N]) +m4trace:configure.in:1: -1- AC_SUBST([ECHO_T]) +m4trace:configure.in:1: -1- AC_SUBST([LIBS]) +m4trace:configure.in:2: -1- AC_CONFIG_HEADERS([src/config.h]) +m4trace:configure.in:2: -1- _m4_warn([obsolete], [The macro `AC_OUTPUT_COMMANDS' is obsolete. +You should run autoupdate.], [autoconf/status.m4:318: AC_OUTPUT_COMMANDS is expanded from... +aclocal.m4:855: AM_CONFIG_HEADER is expanded from... +configure.in:2: the top level]) +m4trace:configure.in:2: -3- _m4_warn([obsolete], [The macro `_AC_OUTPUT_COMMANDS_CNT' is obsolete. +You should run autoupdate.], [autoconf/status.m4:321: _AC_OUTPUT_COMMANDS_CNT is expanded from... +autoconf/status.m4:318: AC_OUTPUT_COMMANDS is expanded from... +aclocal.m4:855: AM_CONFIG_HEADER is expanded from... +configure.in:2: the top level]) +m4trace:configure.in:3: -1- AM_INIT_AUTOMAKE([bip], [0.0]) +m4trace:configure.in:3: -1- AM_AUTOMAKE_VERSION([1.4-p6]) +m4trace:configure.in:3: -1- AC_PROG_INSTALL +m4trace:configure.in:3: -1- AC_SUBST([INSTALL_PROGRAM]) +m4trace:configure.in:3: -1- AC_SUBST([INSTALL_SCRIPT]) +m4trace:configure.in:3: -1- AC_SUBST([INSTALL_DATA]) +m4trace:configure.in:3: -1- AC_SUBST([PACKAGE]) +m4trace:configure.in:3: -1- AC_SUBST([VERSION]) +m4trace:configure.in:3: -2- AC_DEFINE_TRACE_LITERAL([PACKAGE]) +m4trace:configure.in:3: -2- AH_OUTPUT([PACKAGE], [/* Name of package */ +#undef PACKAGE]) +m4trace:configure.in:3: -2- AC_DEFINE_TRACE_LITERAL([VERSION]) +m4trace:configure.in:3: -2- AH_OUTPUT([VERSION], [/* Version number of package */ +#undef VERSION]) +m4trace:configure.in:3: -1- AC_SUBST([ACLOCAL]) +m4trace:configure.in:3: -1- AC_SUBST([AUTOCONF]) +m4trace:configure.in:3: -1- AC_SUBST([AUTOMAKE]) +m4trace:configure.in:3: -1- AC_SUBST([AUTOHEADER]) +m4trace:configure.in:3: -1- AC_SUBST([MAKEINFO]) +m4trace:configure.in:3: -1- AC_PROG_MAKE_SET +m4trace:configure.in:3: -1- AC_SUBST([SET_MAKE]) +m4trace:configure.in:4: -1- AC_PROG_CC +m4trace:configure.in:4: -1- AC_SUBST([CC]) +m4trace:configure.in:4: -1- AC_SUBST([CFLAGS]) +m4trace:configure.in:4: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.in:4: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.in:4: -1- AC_SUBST([CC]) +m4trace:configure.in:4: -1- AC_SUBST([ac_ct_CC]) +m4trace:configure.in:4: -1- AC_SUBST([CC]) +m4trace:configure.in:4: -1- AC_SUBST([ac_ct_CC]) +m4trace:configure.in:4: -1- AC_SUBST([CC]) +m4trace:configure.in:4: -1- AC_SUBST([CC]) +m4trace:configure.in:4: -1- AC_SUBST([ac_ct_CC]) +m4trace:configure.in:4: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) +m4trace:configure.in:4: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) +m4trace:configure.in:5: -1- AC_PROG_INSTALL +m4trace:configure.in:5: -1- AC_SUBST([INSTALL_PROGRAM]) +m4trace:configure.in:5: -1- AC_SUBST([INSTALL_SCRIPT]) +m4trace:configure.in:5: -1- AC_SUBST([INSTALL_DATA]) +m4trace:configure.in:6: -1- AC_PROG_YACC +m4trace:configure.in:6: -1- AC_SUBST([YACC]) +m4trace:configure.in:7: -1- AC_SUBST([LEX]) +m4trace:configure.in:7: -1- AC_PROG_LEX +m4trace:configure.in:7: -1- AC_SUBST([LEX]) +m4trace:configure.in:7: -1- AC_CHECK_LIB([fl], [yywrap], [LEXLIB="-lfl"], [AC_CHECK_LIB(l, yywrap, LEXLIB="-ll")]) +m4trace:configure.in:7: -1- AC_CHECK_LIB([l], [yywrap], [LEXLIB="-ll"]) +m4trace:configure.in:7: -1- AC_SUBST([LEXLIB]) +m4trace:configure.in:7: -1- AC_SUBST([LEX_OUTPUT_ROOT], [$ac_cv_prog_lex_root]) +m4trace:configure.in:7: -1- AC_DEFINE_TRACE_LITERAL([YYTEXT_POINTER]) +m4trace:configure.in:7: -1- AH_OUTPUT([YYTEXT_POINTER], [/* Define to 1 if `lex\' declares `yytext\' as a `char *\' by default, not a + `char[]\'. */ +#undef YYTEXT_POINTER]) +m4trace:configure.in:7: -1- _m4_warn([obsolete], [The macro `AC_DECL_YYTEXT' is obsolete. +You should run autoupdate.], [autoconf/programs.m4:438: AC_DECL_YYTEXT is expanded from... +aclocal.m4:986: AM_PROG_LEX is expanded from... +configure.in:7: the top level]) +m4trace:configure.in:7: -1- AC_PROG_LEX +m4trace:configure.in:7: -1- _m4_warn([syntax], [AC_PROG_LEX invoked multiple times], [autoconf/programs.m4:438: AC_DECL_YYTEXT is expanded from... +aclocal.m4:986: AM_PROG_LEX is expanded from... +configure.in:7: the top level]) +m4trace:configure.in:17: -1- AC_CHECK_LIB([ssl], [SSL_read], [], [ + echo "Error! You need to have libssl around." + exit -1 + ]) +m4trace:configure.in:17: -1- AH_OUTPUT([HAVE_LIBSSL], [/* Define to 1 if you have the `ssl\' library (-lssl). */ +#undef HAVE_LIBSSL]) +m4trace:configure.in:17: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBSSL]) +m4trace:configure.in:19: -1- AC_CONFIG_FILES([Makefile src/Makefile samples/Makefile]) +m4trace:configure.in:19: -1- _m4_warn([obsolete], [AC_OUTPUT should be used without arguments. +You should run autoupdate.], []) +m4trace:configure.in:19: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) +m4trace:configure.in:19: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..45bee13 --- /dev/null +++ b/config.guess @@ -0,0 +1,1465 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2005-04-22' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +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 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # 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 -q "$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 ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amd64:OpenBSD:*:*) + echo x86_64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + cats:OpenBSD:*:*) + echo arm-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + luna88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit 0 ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + 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 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit 0 ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + 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 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit 0 ;; + 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 0 ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + 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 0 ;; + 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 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + 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 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # 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 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + 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 \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + 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 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????: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 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + 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 0 ;; + *: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 + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 + 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 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 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 + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 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 && $dummy && exit 0 + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + 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 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + 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 0 ;; + 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 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + 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 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + amd64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit 0 ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit 0 ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + 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 ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + 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 0 ;; + 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 0 ;; + 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 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + 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 0 ;; + i*86:*:5:[78]*) + 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 0 ;; + 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 0 ;; + 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 i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + 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 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 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 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *: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 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + 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 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + *86) UNAME_PROCESSOR=i686 ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *: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 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *: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 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit 0 ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms && exit 0 ;; + I*) echo ia64-dec-vms && exit 0 ;; + V*) echo vax-dec-vms && exit 0 ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..87a1ee4 --- /dev/null +++ b/config.sub @@ -0,0 +1,1569 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2005-04-22' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +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 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # 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 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ + kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -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 + ;; + -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/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | msp430 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | msp430-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # 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 + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + 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 + ;; + cr16c) + basic_machine=cr16c-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 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + 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 + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + 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 + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + 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 + ;; + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -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* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) + # 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* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -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 + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + 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 + ;; + *-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 + ;; + -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 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..6e789c8 --- /dev/null +++ b/configure @@ -0,0 +1,4256 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59. +# +# Copyright (C) 2003 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 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# 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'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="src/bip.c" +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT YACC LEX LEXLIB LEX_OUTPUT_ROOT LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# 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. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +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 + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -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 | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$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 ;; + + -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 ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + 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 ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=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 ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + 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'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +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 + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# 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 its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + 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 + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS + +# +# 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 this package 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 \`..'] + +_ACEOF + + cat <<_ACEOF +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] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_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 +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-ssl Drop OpenSSL support + +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 + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style 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 + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd "$ac_popdir" + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright (C) 2003 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 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +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` +hostinfo = `(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=. + echo "PATH: $as_dir" +done + +} >&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_sep= +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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >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 + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +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 `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +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 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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_config_headers="$ac_config_headers src/config.h" + + ac_config_commands="$ac_config_commands default-1" + +am__api_version="1.4" +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# 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. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_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 + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +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. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$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' + +echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "$*" != "X $srcdir/configure conftestfile" \ + && test "$*" != "X conftestfile $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". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftestfile + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +rm -f conftest* +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + +PACKAGE=bip + +VERSION=0.0 + +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + + + +missing_dir=`cd $ac_aux_dir && pwd` +echo "$as_me:$LINENO: checking for working aclocal-${am__api_version}" >&5 +echo $ECHO_N "checking for working aclocal-${am__api_version}... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (aclocal-${am__api_version} --version) < /dev/null > /dev/null 2>&1; then + ACLOCAL=aclocal-${am__api_version} + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + ACLOCAL="$missing_dir/missing aclocal-${am__api_version}" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working autoconf" >&5 +echo $ECHO_N "checking for working autoconf... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoconf --version) < /dev/null > /dev/null 2>&1; then + AUTOCONF=autoconf + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + AUTOCONF="$missing_dir/missing autoconf" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working automake-${am__api_version}" >&5 +echo $ECHO_N "checking for working automake-${am__api_version}... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (automake-${am__api_version} --version) < /dev/null > /dev/null 2>&1; then + AUTOMAKE=automake-${am__api_version} + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + AUTOMAKE="$missing_dir/missing automake-${am__api_version}" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working autoheader" >&5 +echo $ECHO_N "checking for working autoheader... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoheader --version) < /dev/null > /dev/null 2>&1; then + AUTOHEADER=autoheader + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + AUTOHEADER="$missing_dir/missing autoheader" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working makeinfo" >&5 +echo $ECHO_N "checking for working makeinfo... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (makeinfo --version) < /dev/null > /dev/null 2>&1; then + MAKEINFO=makeinfo + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + MAKEINFO="$missing_dir/missing makeinfo" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&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 +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_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" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +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 + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + 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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out 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. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$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 +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 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 -std1. */ +int osf4_cc_array ['\x00' == 0 ? 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 +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext 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 + +# 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. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_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 + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +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. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$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' + +for ac_prog in 'bison -y' byacc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_YACC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$YACC"; then + ac_cv_prog_YACC="$YACC" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_YACC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +YACC=$ac_cv_prog_YACC +if test -n "$YACC"; then + echo "$as_me:$LINENO: result: $YACC" >&5 +echo "${ECHO_T}$YACC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$YACC" && break +done +test -n "$YACC" || YACC="yacc" + + +missing_dir=`cd $ac_aux_dir && pwd` +for ac_prog in flex lex +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LEX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LEX"; then + ac_cv_prog_LEX="$LEX" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LEX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LEX=$ac_cv_prog_LEX +if test -n "$LEX"; then + echo "$as_me:$LINENO: result: $LEX" >&5 +echo "${ECHO_T}$LEX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LEX" && break +done +test -n "$LEX" || LEX="$missing_dir/missing flex" + +for ac_prog in flex lex +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LEX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LEX"; then + ac_cv_prog_LEX="$LEX" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LEX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LEX=$ac_cv_prog_LEX +if test -n "$LEX"; then + echo "$as_me:$LINENO: result: $LEX" >&5 +echo "${ECHO_T}$LEX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LEX" && break +done +test -n "$LEX" || LEX=":" + +if test -z "$LEXLIB" +then + echo "$as_me:$LINENO: checking for yywrap in -lfl" >&5 +echo $ECHO_N "checking for yywrap in -lfl... $ECHO_C" >&6 +if test "${ac_cv_lib_fl_yywrap+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char yywrap (); +int +main () +{ +yywrap (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_fl_yywrap=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_fl_yywrap=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_fl_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_fl_yywrap" >&6 +if test $ac_cv_lib_fl_yywrap = yes; then + LEXLIB="-lfl" +else + echo "$as_me:$LINENO: checking for yywrap in -ll" >&5 +echo $ECHO_N "checking for yywrap in -ll... $ECHO_C" >&6 +if test "${ac_cv_lib_l_yywrap+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ll $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char yywrap (); +int +main () +{ +yywrap (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_l_yywrap=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_l_yywrap=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_l_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_l_yywrap" >&6 +if test $ac_cv_lib_l_yywrap = yes; then + LEXLIB="-ll" +fi + +fi + +fi + +if test "x$LEX" != "x:"; then + echo "$as_me:$LINENO: checking lex output file root" >&5 +echo $ECHO_N "checking lex output file root... $ECHO_C" >&6 +if test "${ac_cv_prog_lex_root+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # The minimal lex program is just a single line: %%. But some broken lexes +# (Solaris, I think it was) want two %% lines, so accommodate them. +cat >conftest.l <<_ACEOF +%% +%% +_ACEOF +{ (eval echo "$as_me:$LINENO: \"$LEX conftest.l\"") >&5 + (eval $LEX conftest.l) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +if test -f lex.yy.c; then + ac_cv_prog_lex_root=lex.yy +elif test -f lexyy.c; then + ac_cv_prog_lex_root=lexyy +else + { { echo "$as_me:$LINENO: error: cannot find output from $LEX; giving up" >&5 +echo "$as_me: error: cannot find output from $LEX; giving up" >&2;} + { (exit 1); exit 1; }; } +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_root" >&6 +rm -f conftest.l +LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root + +echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5 +echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6 +if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # POSIX says lex can declare yytext either as a pointer or an array; the +# default is implementation-dependent. Figure out which it is, since +# not all implementations provide the %pointer and %array declarations. +ac_cv_prog_lex_yytext_pointer=no +echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c +ac_save_LIBS=$LIBS +LIBS="$LIBS $LEXLIB" +cat >conftest.$ac_ext <<_ACEOF +`cat $LEX_OUTPUT_ROOT.c` +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_lex_yytext_pointer=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_save_LIBS +rm -f "${LEX_OUTPUT_ROOT}.c" + +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6 +if test $ac_cv_prog_lex_yytext_pointer = yes; then + +cat >>confdefs.h <<\_ACEOF +#define YYTEXT_POINTER 1 +_ACEOF + +fi + +fi + + +requires_libssl=yes +# Check whether --enable-ssl or --disable-ssl was given. +if test "${enable_ssl+set}" = set; then + enableval="$enable_ssl" + requires_libssl=no +fi; +if test "x$requires_libssl" = "xyes" ; then + +echo "$as_me:$LINENO: checking for SSL_read in -lssl" >&5 +echo $ECHO_N "checking for SSL_read in -lssl... $ECHO_C" >&6 +if test "${ac_cv_lib_ssl_SSL_read+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lssl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char SSL_read (); +int +main () +{ +SSL_read (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ssl_SSL_read=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ssl_SSL_read=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ssl_SSL_read" >&5 +echo "${ECHO_T}$ac_cv_lib_ssl_SSL_read" >&6 +if test $ac_cv_lib_ssl_SSL_read = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSSL 1 +_ACEOF + + LIBS="-lssl $LIBS" + +else + + echo "Error! You need to have libssl around." + exit -1 + +fi + +fi + ac_config_files="$ac_config_files Makefile src/Makefile samples/Makefile" +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, don't put newlines in cache variables' values. +# 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. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *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 \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + 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}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# 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'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -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 + --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_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2003 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + 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 +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS section. +# + + + +_ACEOF + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "samples/Makefile" ) CONFIG_FILES="$CONFIG_FILES samples/Makefile" ;; + "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "src/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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 to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@VERSION@,$VERSION,;t t +s,@ACLOCAL@,$ACLOCAL,;t t +s,@AUTOCONF@,$AUTOCONF,;t t +s,@AUTOMAKE@,$AUTOMAKE,;t t +s,@AUTOHEADER@,$AUTOHEADER,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@YACC@,$YACC,;t t +s,@LEX@,$LEX,;t t +s,@LEXLIB@,$LEXLIB,;t t +s,@LEX_OUTPUT_ROOT@,$LEX_OUTPUT_ROOT,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + # 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. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + # Do quote $f, to prevent DOS paths from being IFS'd. + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +_ACEOF + +# Transform confdefs.h into two sed scripts, `conftest.defines' and +# `conftest.undefs', that substitutes the proper values into +# config.h.in to produce config.h. The first handles `#define' +# templates, and the second `#undef' templates. +# And first: Protect against being on the right side of a sed subst in +# config.status. Protect against being in an unquoted here document +# in config.status. +rm -f conftest.defines conftest.undefs +# Using a here document instead of a string reduces the quoting nightmare. +# Putting comments in sed scripts is not portable. +# +# `end' is used to avoid that the second main sed command (meant for +# 0-ary CPP macros) applies to n-ary macro definitions. +# See the Autoconf documentation for `clear'. +cat >confdef2sed.sed <<\_ACEOF +s/[\\&,]/\\&/g +s,[\\$`],\\&,g +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +t end +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +: end +_ACEOF +# If some macros were called several times there might be several times +# the same #defines, which is useless. Nevertheless, we may not want to +# sort them, since we want the *last* AC-DEFINE to be honored. +uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines +sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs +rm -f confdef2sed.sed + +# This sed command replaces #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. +cat >>conftest.undefs <<\_ACEOF +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +_ACEOF + +# Break up conftest.defines because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS +echo ' :' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.defines >/dev/null +do + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/defines.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines +echo ' fi # grep' >>$CONFIG_STATUS +echo >>$CONFIG_STATUS + +# Break up conftest.undefs because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #undef templates' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.undefs >/dev/null +do + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/undefs.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail + rm -f conftest.undefs + mv conftest.tail conftest.undefs +done +rm -f conftest.undefs + +cat >>$CONFIG_STATUS <<\_ACEOF + # 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. */ + if test x"$ac_file" = x-; then + echo "/* Generated by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || +$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 +echo "$as_me: executing $ac_dest commands" >&6;} + case $ac_dest in + default-1 ) test -z "$CONFIG_HEADERS" || echo timestamp > src/stamp-h ;; + esac +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# 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 || { (exit 1); exit 1; } +fi + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..b0560b2 --- /dev/null +++ b/configure.in @@ -0,0 +1,19 @@ +AC_INIT(src/bip.c) +AM_CONFIG_HEADER(src/config.h) +AM_INIT_AUTOMAKE(bip,0.0) +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_YACC +AM_PROG_LEX + +requires_libssl=yes +AC_ARG_ENABLE(ssl, + [ --disable-ssl Drop OpenSSL support], + [requires_libssl=no]) +if test "x$requires_libssl" = "xyes" ; then + AC_CHECK_LIB(ssl, SSL_read, [], [ + echo "Error! You need to have libssl around." + exit -1 + ]) +fi +AC_OUTPUT(Makefile src/Makefile samples/Makefile) diff --git a/debian/bip.substvars b/debian/bip.substvars new file mode 100644 index 0000000..a2f5f34 --- /dev/null +++ b/debian/bip.substvars @@ -0,0 +1 @@ +shlibs:Depends=libc6 (>= 2.3.4-1) diff --git a/debian/bip/DEBIAN/control b/debian/bip/DEBIAN/control new file mode 100644 index 0000000..fee7f1d --- /dev/null +++ b/debian/bip/DEBIAN/control @@ -0,0 +1,14 @@ +Package: bip +Version: 0.0-1 +Section: net +Priority: optional +Architecture: i386 +Depends: libc6 (>= 2.3.4-1) +Installed-Size: 172 +Maintainer: Arnaud Cornet +Description: multiuser irc proxy with ssl, conversation replay and more + Bip is a IRC proxy that supports as replaying logged conversation when a client + connects, multiple clients on one irc server connection, SSL support (on both + ends) and has a handy logging directory structure. It is multiuser, and has a + flexible configuration. Some of it's configuration can be changed at runtime + with special irc commands. diff --git a/debian/bip/DEBIAN/md5sums b/debian/bip/DEBIAN/md5sums new file mode 100644 index 0000000..f3e937e --- /dev/null +++ b/debian/bip/DEBIAN/md5sums @@ -0,0 +1,9 @@ +2fcb2e23f48dd8e205b6e434bb0a1e49 usr/bin/bip +df1d3b30f4ccb839963d39b67fcc83e3 usr/bin/genpwent +816e04d8e35370693904cc3a06107e56 usr/share/bip/bip.conf +48f6c5372dbef10c96f251f313a4c83b usr/share/bip/bip.vim +b35795a23db4c45c95fc897375954a49 usr/share/doc/bip/README +08e6785d9f0333a1f0009c71655a8e6a usr/share/doc/bip/TODO +c9367cfeedf1700a01107616effd5c8e usr/share/doc/bip/AUTHORS +75e57f35e3a9155f3cd215d43dd31380 usr/share/doc/bip/changelog.gz +9416df600764b0209c175026fd2f7702 usr/share/doc/bip/changelog.Debian.gz diff --git a/debian/bip/usr/bin/bip b/debian/bip/usr/bin/bip new file mode 100755 index 0000000000000000000000000000000000000000..f4c25783ec93d535030719097694d1062170db8b GIT binary patch literal 89144 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�(orLx2gbV7d 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 NlkYnQLCSJI{|_3@ZD{}i literal 0 HcmV?d00001 diff --git a/debian/bip/usr/share/bip/bip.conf b/debian/bip/usr/share/bip/bip.conf new file mode 100644 index 0000000..e41b8bf --- /dev/null +++ b/debian/bip/usr/share/bip/bip.conf @@ -0,0 +1,122 @@ +# bip default config file. +# Thou shoult change thy password + +ip = "0.0.0.0"; + +# To connect a client to bip, try the port below, and +# be sure to set the username and password to the values +# specified in the network you want to connect to. +port = 7778; + +# If you set this to true, you'll only be able to connect to bip +# with a SSL capable IRC client. Be sure to generate a certificate +# for bip with 'make cert' +client_side_ssl = false; + +log_level = 3; + +# This is where logs go. Channel and private messages will use that +# configuration value as a prefix, and then log_format to determine +# full log filename. +#log_root = "/var/proxy/logs"; + +# Log format allows you to make log filenames depend on the log line's +# attributes. Here's a list : +# %u -> user name +# %n -> network name +# %Y -> 4 digit year +# %m -> 2 digit month +# %d -> 2 digit day +# %c -> destination (#chan, privates, ...) +#log_format = "%n/%Y-%m/%c.%d.log"; + +# Sets the frequency (in seconds) of log syncing (real write to kernel) +#log_sync_interval = 5; + +# Makes bip send the log of each channel and privates while +# you were not connected to the proxy upon connection. +#no_backlog = false; # disable backlog +backlog_lines = 10; # number of lines in backlog, 0 means no limit +always_backlog = true; # backlog even lines already backlogged + +# Network definition, a name and server info +network { + name = "iiens"; + server { host = "irc.iiens.net"; port = 6667; }; +}; + +network { + name = "freenode"; + server { host = "irc.freenode.org"; port = 6667; }; + server { host = "brown.freenode.net"; port = 6667; }; + server { host = "thunder.stealer.net"; port = 6667; }; +}; + +# Configuration example with one user who connects to two irc networks +# To use the multi-server feature: +# - define the connections +# - chose and setup a different login for each connection +# on your irc client: +# - Use the multi server feature of your client, the server beeing each time +# the server where bip is running. In your client setup realname or username +# to the value of login in the corresponding connection. + +# User structure is grouping information for a given user +user { + # The name in bip of the user + # This is used by bip only + name = "nohar"; + # this user's password + password = "233a8d53b55a268d4a84a3acdd5ed57d"; # (md5(md5("tata"))) + + # A user can have mutiple connections to irc networks. + # define a connection: + connection { + name = "iiens"; # used by bip only + network = "iiens"; # which ircnet to connect to + + login = "bipbip"; # used to auth user and to diffenciate + # among multiple connections of a user. + # in your irc client setup username or + # realname to this login value. + + # Information sent to the irc server: + nick = "bip`luser"; + user = "bipbip"; + realname = "coyote"; + #password = "serverpassword"; + + # Some options: + #away_nick = "bip`away"; + #follow_nick = true; + #ignore_first_nick = true; + #on_connect_send = "PRIVMSG NickServ :IDENTIFY nspassword"; + + # Autojoined channels: + channel { name = "#bip"; }; + }; + connection { + name = "freenode"; # used by bip only + network = "freenode"; # which ircnet to connect to + + login = "bipfnode"; # used to auth user and to diffenciate + # among multiple connections of a user. + # in your irc client setup username or + # realname to this login value. + + # Information sent to the irc server: + nick = "bip`luser"; + user = "bipbip"; + realname = "coyote"; + #password = "serverpassword"; + + # Some options: + #away_nick = "bip`away"; + #follow_nick = true; + #ignore_first_nick = true; + #on_connect_send = "PRIVMSG NickServ :IDENTIFY nspassword"; + + # Autojoined channels: + channel { name = "#bip"; }; + }; +}; diff --git a/debian/bip/usr/share/bip/bip.vim b/debian/bip/usr/share/bip/bip.vim new file mode 100644 index 0000000..9ee21ad --- /dev/null +++ b/debian/bip/usr/share/bip/bip.vim @@ -0,0 +1,135 @@ +" Vim syntax file +" Language: Bip configuration file +" Copyright: Copyright (C) 2004 Arnaud Cornet and Loïc Gomez +" License: This file is part of the bip project. See the file 'COPYING' for +" the exact licensing terms. +" +" +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +syn case ignore + +" Global elements +syn match bipComment contained %\s*#.*$% +syn match bipEndError contained /\(#.*\)\@ +else + command -nargs=+ HiLink hi def link +endif + +HiLink bipMain Error +HiLink bipNetwork Error +HiLink bipChannel Error +HiLink bipServer Error +HiLink bipUser Error + +" We do not HiLink bipWhite, siec we only want to ignore it. +HiLink bipKeyword Keyword +HiLink bipNKeyword Keyword +HiLink bipUKeyword Keyword +HiLink bipCKeyword Keyword +HiLink bipSKeyword Keyword +HiLink bipCoKeyword Keyword + +HiLink bipComment Comment + +HiLink bipMatch Include + +HiLink bipStringV Error +HiLink bipBoolV Error +HiLink bipNumericV Error +HiLink bipIPV Error + +HiLink bipEndError Error + +HiLink bipString String +HiLink bipBool Boolean +HiLink bipNumeric Number +HiLink bipIP String +HiLink bipAddrTk String +HiLink bipDot Delimiter +HiLink bipSlash Delimiter +HiLink bipMask Number + +delcommand HiLink + +let b:current_syntax = "bip" +" vim: ts=8 diff --git a/debian/bip/usr/share/doc/bip/AUTHORS b/debian/bip/usr/share/doc/bip/AUTHORS new file mode 100644 index 0000000..d579fa2 --- /dev/null +++ b/debian/bip/usr/share/doc/bip/AUTHORS @@ -0,0 +1,6 @@ +Arnaud 'nohar' Cornet +Loïc 'Kyoshiro' Gomez + +Thanks to jj, YS and lafounie, for hanging around while we were coding. + +Crypto shamelessly taken from Christophe 'sexy' Devine. diff --git a/debian/bip/usr/share/doc/bip/README b/debian/bip/usr/share/doc/bip/README new file mode 100644 index 0000000..3be0aa0 --- /dev/null +++ b/debian/bip/usr/share/doc/bip/README @@ -0,0 +1,2 @@ +log encryption support +salt this md5 diff --git a/debian/bip/usr/share/doc/bip/TODO b/debian/bip/usr/share/doc/bip/TODO new file mode 100644 index 0000000..b0f5b98 --- /dev/null +++ b/debian/bip/usr/share/doc/bip/TODO @@ -0,0 +1,9 @@ +- SSL certificate verification +- allowed IP filtering +- multi user (user/pass to identify user + realname to id. network) +- keep invites when detached +- DCC proxying ? +- /bip command, for admin (rehash, jump, ...) +- crypt logs + +tidy up irc_server/server structures diff --git a/debian/bip/usr/share/doc/bip/changelog.Debian.gz b/debian/bip/usr/share/doc/bip/changelog.Debian.gz new file mode 100644 index 0000000000000000000000000000000000000000..17319469bc5e0566dd3489399386ff7254925360 GIT binary patch literal 159 zcmV;Q0AT+giwFoXuV+F617m1mZf9j|Z)Yw9U5JusBpW@mpyRsOAUWN07=c?iouCgwykJM;gcn97~KEe|Es3p|G+K#9@w=h&( N{Q>Ek6o82U008$cMqdB` literal 0 HcmV?d00001 diff --git a/debian/bip/usr/share/doc/bip/changelog.gz b/debian/bip/usr/share/doc/bip/changelog.gz new file mode 100644 index 0000000000000000000000000000000000000000..50116be0f17e61c2a7c0a111b8338c2f17e4d37d GIT binary patch literal 126 zcmV-^0D=D>iwFp9tY<<317m1mZf9j|Z)X5AGB7aJH89aNGE`7-EXqqPO;K>pFUm_T zQLxF&&qyqCC^0P319I)SxD=p3OQE Thu, 20 Apr 2005 22:00:45 -0200 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +4 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..3c1456a --- /dev/null +++ b/debian/control @@ -0,0 +1,16 @@ +Source: bip +Section: net +Priority: optional +Maintainer: Arnaud Cornet +Standards-Version: 3.6.1.1 +Build-Depends: cdbs, libssl-dev, bison, flex + +Package: bip +Architecture: any +Depends: ${shlibs:Depends} +Description: multiuser irc proxy with ssl, conversation replay and more + Bip is a IRC proxy that supports as replaying logged conversation when a client + connects, multiple clients on one irc server connection, SSL support (on both + ends) and has a handy logging directory structure. It is multiuser, and has a + flexible configuration. Some of it's configuration can be changed at runtime + with special irc commands. diff --git a/debian/files b/debian/files new file mode 100644 index 0000000..91fc1c0 --- /dev/null +++ b/debian/files @@ -0,0 +1 @@ +bip_0.0-1_i386.deb net optional diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..c19b8ef --- /dev/null +++ b/debian/rules @@ -0,0 +1,4 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/autotools.mk diff --git a/debian/stamp-autotools-files b/debian/stamp-autotools-files new file mode 100644 index 0000000..e69de29 diff --git a/debian/stamp-makefile-build b/debian/stamp-makefile-build new file mode 100644 index 0000000..e69de29 diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..d4744f0 --- /dev/null +++ b/install-sh @@ -0,0 +1,269 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# +# 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. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# 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 $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/missing b/missing new file mode 100755 index 0000000..22e101a --- /dev/null +++ b/missing @@ -0,0 +1,198 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright (C) 1996, 1997, 2001, 2002 Free Software Foundation, Inc. +# Franc,ois 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.in; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing - GNU libit 0.0" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`$configure_ac'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`$configure_ac'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`$configure_ac'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' $configure_ac` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`$configure_ac'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100755 index 0000000..4f58503 --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/samples/Makefile.am b/samples/Makefile.am new file mode 100644 index 0000000..5c83be9 --- /dev/null +++ b/samples/Makefile.am @@ -0,0 +1,2 @@ +examplesdir = $(prefix)/share/doc/bip/examples/ +examples_DATA = bip.conf bip.vim diff --git a/samples/Makefile.in b/samples/Makefile.in new file mode 100644 index 0000000..6bfa6d6 --- /dev/null +++ b/samples/Makefile.in @@ -0,0 +1,202 @@ +# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999, 2001 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. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +CC = @CC@ +HAVE_LIB = @HAVE_LIB@ +LEX = @LEX@ +LIB = @LIB@ +LTLIB = @LTLIB@ +MAKEINFO = @MAKEINFO@ +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ +YACC = @YACC@ + +examplesdir = $(prefix)/share/doc/bip/examples/ +examples_DATA = bip.conf bip.vim +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../src/config.h +CONFIG_CLEAN_FILES = +DATA = $(examples_DATA) + +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu samples/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +install-examplesDATA: $(examples_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(examplesdir) + @list='$(examples_DATA)'; for p in $$list; do \ + if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(examplesdir)/$$p"; \ + $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(examplesdir)/$$p; \ + else if test -f $$p; then \ + echo " $(INSTALL_DATA) $$p $(DESTDIR)$(examplesdir)/$$p"; \ + $(INSTALL_DATA) $$p $(DESTDIR)$(examplesdir)/$$p; \ + fi; fi; \ + done + +uninstall-examplesDATA: + @$(NORMAL_UNINSTALL) + list='$(examples_DATA)'; for p in $$list; do \ + rm -f $(DESTDIR)$(examplesdir)/$$p; \ + done +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = samples + +distdir: $(DISTFILES) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(top_distdir) && pwd`; \ + distdir=`cd $(distdir) && pwd`; \ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu samples/Makefile + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: install-examplesDATA +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-examplesDATA +uninstall: uninstall-am +all-am: Makefile $(DATA) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(examplesdir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: uninstall-examplesDATA install-examplesDATA tags distdir info-am \ +info dvi-am dvi check check-am installcheck-am installcheck \ +install-exec-am install-exec install-data-am install-data install-am \ +install uninstall-am uninstall all-redirect all-am all installdirs \ +mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# 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/samples/bip.conf b/samples/bip.conf new file mode 100644 index 0000000..e41b8bf --- /dev/null +++ b/samples/bip.conf @@ -0,0 +1,122 @@ +# bip default config file. +# Thou shoult change thy password + +ip = "0.0.0.0"; + +# To connect a client to bip, try the port below, and +# be sure to set the username and password to the values +# specified in the network you want to connect to. +port = 7778; + +# If you set this to true, you'll only be able to connect to bip +# with a SSL capable IRC client. Be sure to generate a certificate +# for bip with 'make cert' +client_side_ssl = false; + +log_level = 3; + +# This is where logs go. Channel and private messages will use that +# configuration value as a prefix, and then log_format to determine +# full log filename. +#log_root = "/var/proxy/logs"; + +# Log format allows you to make log filenames depend on the log line's +# attributes. Here's a list : +# %u -> user name +# %n -> network name +# %Y -> 4 digit year +# %m -> 2 digit month +# %d -> 2 digit day +# %c -> destination (#chan, privates, ...) +#log_format = "%n/%Y-%m/%c.%d.log"; + +# Sets the frequency (in seconds) of log syncing (real write to kernel) +#log_sync_interval = 5; + +# Makes bip send the log of each channel and privates while +# you were not connected to the proxy upon connection. +#no_backlog = false; # disable backlog +backlog_lines = 10; # number of lines in backlog, 0 means no limit +always_backlog = true; # backlog even lines already backlogged + +# Network definition, a name and server info +network { + name = "iiens"; + server { host = "irc.iiens.net"; port = 6667; }; +}; + +network { + name = "freenode"; + server { host = "irc.freenode.org"; port = 6667; }; + server { host = "brown.freenode.net"; port = 6667; }; + server { host = "thunder.stealer.net"; port = 6667; }; +}; + +# Configuration example with one user who connects to two irc networks +# To use the multi-server feature: +# - define the connections +# - chose and setup a different login for each connection +# on your irc client: +# - Use the multi server feature of your client, the server beeing each time +# the server where bip is running. In your client setup realname or username +# to the value of login in the corresponding connection. + +# User structure is grouping information for a given user +user { + # The name in bip of the user + # This is used by bip only + name = "nohar"; + # this user's password + password = "233a8d53b55a268d4a84a3acdd5ed57d"; # (md5(md5("tata"))) + + # A user can have mutiple connections to irc networks. + # define a connection: + connection { + name = "iiens"; # used by bip only + network = "iiens"; # which ircnet to connect to + + login = "bipbip"; # used to auth user and to diffenciate + # among multiple connections of a user. + # in your irc client setup username or + # realname to this login value. + + # Information sent to the irc server: + nick = "bip`luser"; + user = "bipbip"; + realname = "coyote"; + #password = "serverpassword"; + + # Some options: + #away_nick = "bip`away"; + #follow_nick = true; + #ignore_first_nick = true; + #on_connect_send = "PRIVMSG NickServ :IDENTIFY nspassword"; + + # Autojoined channels: + channel { name = "#bip"; }; + }; + connection { + name = "freenode"; # used by bip only + network = "freenode"; # which ircnet to connect to + + login = "bipfnode"; # used to auth user and to diffenciate + # among multiple connections of a user. + # in your irc client setup username or + # realname to this login value. + + # Information sent to the irc server: + nick = "bip`luser"; + user = "bipbip"; + realname = "coyote"; + #password = "serverpassword"; + + # Some options: + #away_nick = "bip`away"; + #follow_nick = true; + #ignore_first_nick = true; + #on_connect_send = "PRIVMSG NickServ :IDENTIFY nspassword"; + + # Autojoined channels: + channel { name = "#bip"; }; + }; +}; diff --git a/samples/bip.vim b/samples/bip.vim new file mode 100644 index 0000000..9ee21ad --- /dev/null +++ b/samples/bip.vim @@ -0,0 +1,135 @@ +" Vim syntax file +" Language: Bip configuration file +" Copyright: Copyright (C) 2004 Arnaud Cornet and Loïc Gomez +" License: This file is part of the bip project. See the file 'COPYING' for +" the exact licensing terms. +" +" +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +syn case ignore + +" Global elements +syn match bipComment contained %\s*#.*$% +syn match bipEndError contained /\(#.*\)\@ +else + command -nargs=+ HiLink hi def link +endif + +HiLink bipMain Error +HiLink bipNetwork Error +HiLink bipChannel Error +HiLink bipServer Error +HiLink bipUser Error + +" We do not HiLink bipWhite, siec we only want to ignore it. +HiLink bipKeyword Keyword +HiLink bipNKeyword Keyword +HiLink bipUKeyword Keyword +HiLink bipCKeyword Keyword +HiLink bipSKeyword Keyword +HiLink bipCoKeyword Keyword + +HiLink bipComment Comment + +HiLink bipMatch Include + +HiLink bipStringV Error +HiLink bipBoolV Error +HiLink bipNumericV Error +HiLink bipIPV Error + +HiLink bipEndError Error + +HiLink bipString String +HiLink bipBool Boolean +HiLink bipNumeric Number +HiLink bipIP String +HiLink bipAddrTk String +HiLink bipDot Delimiter +HiLink bipSlash Delimiter +HiLink bipMask Number + +delcommand HiLink + +let b:current_syntax = "bip" +" vim: ts=8 diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..2a85763 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,5 @@ +bin_PROGRAMS = bip genpwent +bip_SOURCES = conf.y lex.l bip.c connection.c irc.c line.c log.c md5.c util.c +genpwent_SOURCES = genpwent.c md5.c util.c +AM_YFLAGS= -d +CFLAGS=-Wall diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..6f1be84 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,375 @@ +# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999, 2001 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. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +CC = @CC@ +HAVE_LIB = @HAVE_LIB@ +LEX = @LEX@ +LIB = @LIB@ +LTLIB = @LTLIB@ +MAKEINFO = @MAKEINFO@ +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ +YACC = @YACC@ + +bin_PROGRAMS = bip genpwent +bip_SOURCES = conf.y lex.l bip.c connection.c irc.c line.c log.c md5.c util.c +genpwent_SOURCES = genpwent.c md5.c util.c +AM_YFLAGS = -d +CFLAGS = -Wall +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +PROGRAMS = $(bin_PROGRAMS) + + +DEFS = @DEFS@ -I. -I$(srcdir) -I. +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +bip_OBJECTS = conf.o lex.o bip.o connection.o irc.o line.o log.o md5.o \ +util.o +bip_LDADD = $(LDADD) +bip_DEPENDENCIES = +bip_LDFLAGS = +genpwent_OBJECTS = genpwent.o md5.o util.o +genpwent_LDADD = $(LDADD) +genpwent_DEPENDENCIES = +genpwent_LDFLAGS = +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LEXLIB = @LEXLIB@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +DIST_COMMON = ./stamp-h.in Makefile.am Makefile.in conf.c config.h.in \ +lex.c + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +DEP_FILES = .deps/bip.P .deps/conf.P .deps/connection.P \ +.deps/genpwent.P .deps/irc.P .deps/lex.P .deps/line.P .deps/log.P \ +.deps/md5.P .deps/util.P +SOURCES = $(bip_SOURCES) $(genpwent_SOURCES) +OBJECTS = $(bip_OBJECTS) $(genpwent_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .l .o .s .y +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +config.h: stamp-h + @if test ! -f $@; then \ + rm -f stamp-h; \ + $(MAKE) stamp-h; \ + else :; fi +stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES= CONFIG_HEADERS=src/config.h \ + $(SHELL) ./config.status + @echo timestamp > stamp-h 2> /dev/null +$(srcdir)/config.h.in: $(srcdir)/stamp-h.in + @if test ! -f $@; then \ + rm -f $(srcdir)/stamp-h.in; \ + $(MAKE) $(srcdir)/stamp-h.in; \ + else :; fi +$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOHEADER) + @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null + +mostlyclean-hdr: + +clean-hdr: + +distclean-hdr: + -rm -f config.h + +maintainer-clean-hdr: + +mostlyclean-binPROGRAMS: + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +distclean-binPROGRAMS: + +maintainer-clean-binPROGRAMS: + +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + if test -f $$p; then \ + echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ + $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + list='$(bin_PROGRAMS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + done + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +bip: $(bip_OBJECTS) $(bip_DEPENDENCIES) + @rm -f bip + $(LINK) $(bip_LDFLAGS) $(bip_OBJECTS) $(bip_LDADD) $(LIBS) + +genpwent: $(genpwent_OBJECTS) $(genpwent_DEPENDENCIES) + @rm -f genpwent + $(LINK) $(genpwent_LDFLAGS) $(genpwent_OBJECTS) $(genpwent_LDADD) $(LIBS) +.l.c: + $(LEX) $(AM_LFLAGS) $(LFLAGS) $< && mv $(LEX_OUTPUT_ROOT).c $@ +.y.c: + $(YACC) $(AM_YFLAGS) $(YFLAGS) $< && mv y.tab.c $*.c + if test -f y.tab.h; then \ + if cmp -s y.tab.h $*.h; then rm -f y.tab.h; else mv y.tab.h $*.h; fi; \ + else :; fi +conf.h: conf.c + + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags -o $$here/TAGS $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP)) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = src + +distdir: $(DISTFILES) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(top_distdir) && pwd`; \ + distdir=`cd $(distdir) && pwd`; \ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu src/Makefile + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + +DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) + +-include $(DEP_FILES) + +mostlyclean-depend: + +clean-depend: + +distclean-depend: + -rm -rf .deps + +maintainer-clean-depend: + +%.o: %.c + @echo '$(COMPILE) -c $<'; \ + $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-cp .deps/$(*F).pp .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm .deps/$(*F).pp + +%.lo: %.c + @echo '$(LTCOMPILE) -c $<'; \ + $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ + < .deps/$(*F).pp > .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm -f .deps/$(*F).pp +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +all-recursive-am: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +install-exec-am: install-binPROGRAMS +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-binPROGRAMS +uninstall: uninstall-am +all-am: Makefile $(PROGRAMS) config.h +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(bindir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + -test -z "lexcconfhconfc" || rm -f lexc confh confc +mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS \ + mostlyclean-compile mostlyclean-tags mostlyclean-depend \ + mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-tags \ + clean-depend clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile \ + distclean-tags distclean-depend distclean-generic \ + clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS \ + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-depend maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ +mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ +maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile tags mostlyclean-tags distclean-tags \ +clean-tags maintainer-clean-tags distdir mostlyclean-depend \ +distclean-depend clean-depend maintainer-clean-depend info-am info \ +dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ +install-exec-am install-exec install-data-am install-data install-am \ +install uninstall-am uninstall all-redirect all-am all installdirs \ +mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# 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/bip.c b/src/bip.c new file mode 100644 index 0000000..1b49867 --- /dev/null +++ b/src/bip.c @@ -0,0 +1,981 @@ +/* + * $Id: bip.c,v 1.39 2005/04/21 06:58:50 nohar Exp $ + * + * This file is part of the bip project + * Copyright (C) 2004 Arnaud Cornet and Loïc Gomez + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "config.h" +#include +#include +#include +#include +#include +#include "irc.h" +#include "conf.h" +#include "tuple.h" +#include "log.h" +#include "irc.h" +#include "bip.h" +#include "line.h" + +int sighup = 0; +char *conf_log_root; +char *conf_log_format; +int conf_log_level; + + +char *conf_ip; +unsigned short conf_port; +int conf_css; +#ifdef HAVE_LIBSSL +char *conf_ssl_certfile; +#endif +int conf_daemonize; +char *conf_pid_file; +hash_t conf_networks; +hash_t conf_users; +char *conf_biphome; +hash_t adm_users; + +/* log options, for sure the trickiest :) */ +/* no backlog at all */ +int conf_no_backlog; +/* number of lines in backlog */ +int conf_backlog_lines = 10; +/* backlog even lines already backlogged */ +int conf_always_backlog; +int conf_log_sync_interval; + +static void conf_die(char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + exit(1); +} + +static void hash_binary(char *hex, unsigned char **password, unsigned int *seed) +{ + unsigned char *md5; + unsigned int buf; + int i; + + if (strlen(hex) != 40) + fatal("Incorrect password format %s\n", hex); + + md5 = malloc(20); + for (i = 0; i < 20; i++) { + sscanf(hex + 2 * i, "%02x", &buf); + md5[i] = buf; + } + + *seed = 0; + sscanf(hex, "%02x", &buf); + *seed |= buf << 24; + sscanf(hex + 2, "%02x", &buf); + *seed |= buf << 16; + sscanf(hex + 2 * 2, "%02x", &buf); + *seed |= buf << 8; + sscanf(hex + 2 * 3, "%02x", &buf); + *seed |= buf; + + *password = md5; +} + +void server_free(struct server *s) +{ + free(s->host); + free(s); +} + +static void add_server(list_t *serverl, list_t *data) +{ + struct tuple *t; + struct server *s; + s = calloc(sizeof(struct server), 1); + s->port = 6667; /* default port */ + + while ((t = list_remove_first(data))) { + switch (t->type) { + case LEX_HOST: + s->host = t->pdata; + break; + case LEX_PORT: + s->port = t->ndata; + break; + default: + fatal("Config error in server block (%d)", t->type); + } + } + if (!s->host) + fatal("Server conf: host not set"); + list_add_last(serverl, s); +} + +extern list_t *root_list; +int yyparse(); +int conf_error; +#define ERRBUFSZ 80 +char conf_errstr[ERRBUFSZ]; +void free_conf(list_t *l); + +list_t *parse_conf(FILE *file); + +void free_conf(list_t *l) +{ + struct tuple *t; + list_iterator_t li; + for (list_it_init(l, &li); (t = list_it_item(&li)); list_it_next(&li)) { + switch (t->tuple_type) { + case TUPLE_STR: + free(t->pdata); /* no break, for the style */ + case TUPLE_INT: + free(t); + break; + case TUPLE_LIST: + free_conf(t->pdata); + break; + default: + fatal("internal error free_conf"); + break; + } + } +} + +FILE *conf_global_log_file; + +static pid_t daemonize(void) +{ + char buf[4096]; + switch (fork()) { + case -1: + fatal("Fork failed"); + break; + case 0: + break; + default: + exit(0); + } + if (setsid() < 0) + fatal("setsid() failed"); + snprintf(buf, 4095, "%s/bip.syslog", conf_log_root); + FILE *f = fopen(buf, "a"); + if (!f) + fatal("Can't open %s: %s", buf, strerror(errno)); + + close(0); + close(1); + close(2); + /* This better be the very last action since fatal makes use of + * conf_global_log_file */ + conf_global_log_file = f; + return getpid(); +} + +/* RACE CONDITION! */ +int do_pid_stuff(void) +{ + char hname[1024]; + char longpath[1024]; + FILE *f; +try_again: + f = fopen(conf_pid_file, "r"); + if (f) + goto pid_is_there; + if (gethostname(hname, 1023) == -1) + fatal("%s %s", "gethostname", strerror(errno)); + snprintf(longpath, 1023, "%s.%s.%ld", conf_pid_file, hname, + (long unsigned int)getpid()); + int fd; + if ((fd = open(longpath, O_CREAT|O_WRONLY, S_IWUSR|S_IRUSR)) == -1) + fatal("%s %s", "open", strerror(errno)); + if (link(longpath, conf_pid_file) == -1) { + struct stat buf; + if (stat(longpath, &buf) == -1) { + if (buf.st_nlink != 2) { + f = fopen(conf_pid_file, "r"); + goto pid_is_there; + } + } + } + unlink(longpath); + return fd; +pid_is_there: + { + pid_t pid; + long unsigned int p; + if (f) { + int c = fscanf(f, "%ld", &p); + pid = p; + if (c != 1 || p == 0) { + mylog(LOG_INFO, "pid file found but invalid " + "data inside. Continuing...\n"); + if (unlink(conf_pid_file)) { + fatal("Cannot delete pid file '%s', " + "check permissions.\n", + conf_pid_file); + } + goto try_again; + } + } else + pid = 0; + int kr = kill(pid, 0); + if (kr == -1 && (errno == ESRCH || errno == EPERM)) { + /* that's not bip! */ + fclose(f); + if (unlink(conf_pid_file)) { + fatal("Cannot delete pid file '%s', check " + "permissions.\n", + conf_pid_file); + } + goto try_again; + } + if (pid) + mylog(LOG_INFO, "pid file found (pid %ld).", pid); + mylog(LOG_INFO, "Another instance of bip is certainly runing."); + mylog(LOG_INFO, "If you are sure this is not the case remove" + " %s.", conf_pid_file); + exit(2); + } + return 0; +} + +#define S_CONF "/.bip/bip.conf" + +static void usage(char *name) +{ + printf( +"Usage: %s [-f config_file] [-h] [-n]\n" +" -f config_file: Use config_file as the configuration file\n" +" If no config file is given %s will try to open ~" S_CONF "\n" +" -n: Don't daemonize, log in stderr\n" +" -h: This help\n", name, name); + exit(1); +} + +void reload_config(int i) +{ + sighup = 1; +} + +void bad_quit(int i) +{ + unlink(conf_pid_file); + exit(i); +} + +#if 0 +void check_networks(list_t *networkl) +{ + list_iterator_t li; + struct irc_server *is; + hash_t *netnames; + + netnames = hash_new(HASH_DEFAULT); + for (list_it_init(networkl, &li); (is = list_it_item(&li)); + list_it_next(&li)) { +/* + hash_iterator_t hi; +*/ + + /* Should *NEVER* happen */ + if (!is->name) + fatal("CONF: Unnamed network !"); + if (hash_get(netnames, is->name)) + fatal("CONF: Two networks have the same name !"); + hash_insert(netnames, is->name, is); + if (!is->serverc) + fatal("CONF: No servers to connect to in network %s", + is->name); + + /* TODO check for identical channels or servers */ + + /* It could be great to check it here, but we need to check it + * before... + */ + /* + for (hash_it_init(&is->chan_infos, &hi); hash_it_item(&hi); + hash_it_next(&hi)) { + struct chan_info *ci = hash_it_item(&hi); + if (!ci->name) + fatal("CONF: Unnamed channel in network %s", + is->name); + } + */ + } + hash_free(netnames); +} + +void check_clients(list_t *clientl) +{ + list_iterator_t li; + struct client *ic; + + for (list_it_init(clientl, &li); (ic = list_it_item(&li)); + list_it_next(&li)) { + char *netname; + + /* TODO hash(user => pass) to check for auth collision */ + + /* Should *NEVER* happen */ + if (!ic->server) + fatal("CONF: Unaffected client in list..."); + netname = ic->server->name; + /* + if (!ic->user) + fatal("CONF: Client block with no user in network %s", + netname); + */ + if (!ic->pass) + fatal("CONF: Client block with no pass in network %s", + netname); + } +} +#endif + +void c_network_free(struct c_network *on) +{ + struct server *s; + free(on->name); + s = list_remove_first(&on->serverl); + free(s->host); + free(on); +} + +void add_network(list_t *data) +{ + struct tuple *t; + struct c_network *n; + n = calloc(sizeof(struct c_network), 1); + + list_init(&n->serverl, NULL); + + while ((t = list_remove_first(data))) { + switch (t->type) { + case LEX_NAME: + n->name = t->pdata; + break; +#ifdef HAVE_LIBSSL + case LEX_SSL: + n->ssl = t->ndata; + break; +#endif + case LEX_SERVER: + add_server(&n->serverl, t->pdata); + break; + default: + conf_die("uknown keyword in network statement"); + break; + } + } + if (!n->name) + conf_die("Network with no name"); + struct c_network *old_n; + old_n = hash_get(&conf_networks, n->name); + if (old_n) { + hash_remove(&conf_networks, n->name); + c_network_free(old_n); + } + hash_insert(&conf_networks, n->name, n); +} + +void add_channel(list_t *channell, list_t *data) +{ + struct tuple *t; + struct c_channel *c; + c = calloc(sizeof(struct c_channel), 1); + + while ((t = list_remove_first(data))) { + switch (t->type) { + case LEX_NAME: + c->name = t->pdata; + break; + case LEX_KEY: + c->key = t->pdata; + break; + default: + conf_die("uknown keyword in channel statement"); + break; + } + } + if (!c->name) + conf_die("channel wo a name !"); + list_add_last(channell, c); +} + +void c_connection_free(struct c_connection *c) +{ + /* XXX network free! */ + free(c->user); + free(c->password); + free(c->vhost); + + struct c_channel *chan; + while ((chan = list_remove_first(&c->channell))) { + free(chan->name); + if (chan->key) + free(chan->key); + free(chan); + } + + free(c->away_nick); + free(c->on_connect_send); +} + +void add_connection(list_t *connectionl, list_t *data, list_t *old_c_connl) +{ + struct tuple *t; + struct c_connection *c, *old_c = NULL; + c = calloc(sizeof(struct c_connection), 1); + + list_init(&c->channell, NULL); + + while ((t = list_remove_first(data))) { + switch (t->type) { + case LEX_NAME: + c->name = t->pdata; + break; + case LEX_NETWORK: + c->network = hash_get(&conf_networks, t->pdata); + if (!c->network) + conf_die("networkd:%s used but not defined\n", + t->pdata); + break; + case LEX_LOGIN: + if (!is_valid_username(t->pdata)) + conf_die("Invalid login (%s)", t->pdata); + c->login = t->pdata; + break; + case LEX_NICK: + if (!is_valid_nick(t->pdata)) + conf_die("Invalid nickname (%s)", t->pdata); + c->nick = t->pdata; + break; + case LEX_USER: + c->user = t->pdata; + break; + case LEX_REALNAME: + c->realname = t->pdata; + break; + case LEX_PASSWORD: + c->password = t->pdata; + break; + case LEX_CHANNEL: + add_channel(&c->channell, t->pdata); + break; + case LEX_FOLLOW_NICK: + c->follow_nick = t->ndata; + break; + case LEX_IGN_FIRST_NICK: + c->ignore_first_nick = t->ndata; + break; + case LEX_AWAY_NICK: + c->away_nick = t->pdata; + break; + case LEX_ON_CONNECT_SEND: + c->on_connect_send = t->pdata; + break; + default: + conf_die("uknown keyword in connection statement"); + break; + } + } + /* checks that can only be here, or must */ + if (!c->network) + conf_die("Missing network in connection block"); + if (!c->user) + conf_die("Missing user in connection block"); + + list_add_last(connectionl, c); + if (old_c_connl) { + old_c = list_remove_first(old_c_connl); + if (old_c) + c_connection_free(old_c); + } +} + +void c_user_free(struct c_user *cu) +{ + free(cu->name); + free(cu->password); + struct c_connection *con; + while ((con = list_remove_first(&cu->connectionl))) + c_connection_free(con); + free(cu); +} + +void add_user(list_t *data) +{ + struct tuple *t; + struct c_user *u; + struct c_user *old_u; + u = calloc(sizeof(struct c_user), 1); + + list_init(&u->connectionl, NULL); + + while ((t = list_remove_first(data))) { + switch (t->type) { + case LEX_NAME: + u->name = t->pdata; + old_u = hash_get(&conf_users, u->name); + break; + case LEX_PASSWORD: + hash_binary(t->pdata, &u->password, &u->seed); + free(t->pdata); + break; + case LEX_CONNECTION: + if (!u->name) + conf_die("name statement must be first in user" + "block"); + if (!old_u) + add_connection(&u->connectionl, t->pdata, NULL); + else + add_connection(&u->connectionl, t->pdata, + &old_u->connectionl); + break; + default: + conf_die("uknown keyword in user statement"); + break; + } + } + if (!u->name) + conf_die("User w/o a name!"); + if (!u->password) + conf_die("Missing password in user block"); + + if (old_u) { + hash_remove(&conf_users, u->name); + c_user_free(old_u); + } + hash_insert(&conf_users, u->name, u); +} + +int fireup(FILE *conf) +{ + struct tuple *t; + list_t *l; + l = parse_conf(conf); + if (conf_error) + return 0; + + list_iterator_t li; + + for (list_it_init(l, &li); (t = list_it_item(&li)); list_it_next(&li)) { + switch (t->type) { + case LEX_LOG_SYNC_INTERVAL: + conf_log_sync_interval = t->ndata; + break; + case LEX_ALWAYS_BACKLOG: + conf_always_backlog = t->ndata; + break; + case LEX_NO_BACKLOG: + conf_no_backlog = t->ndata; + break; + case LEX_BACKLOG_LINES: + conf_backlog_lines = t->ndata; + break; + case LEX_LOG_ROOT: + if (conf_log_root) + free(conf_log_root); + conf_log_root = t->pdata; + break; + case LEX_LOG_FORMAT: + if (conf_log_format) + free(conf_log_format); + conf_log_format = t->pdata; + break; + case LEX_LOG_LEVEL: + conf_log_level = t->ndata; + break; + case LEX_IP: + if (conf_ip) + free(conf_ip); + conf_ip = t->pdata; + break; + case LEX_PORT: + conf_port = t->ndata; + break; + case LEX_CSS: + conf_css = t->ndata; + break; + case LEX_PID_FILE: + if (conf_pid_file) + free(conf_pid_file); + conf_pid_file = t->pdata; + break; + case LEX_NETWORK: + add_network(t->pdata); + break; + case LEX_USER: + add_user(t->pdata); + break; + default: + fatal("Config error in base config (%d)", t->type); + break; + } + } + + /* + check_networks(networkl); + check_clients(userl); + */ + + if (!conf_biphome) { + char *home = getenv("HOME"); + if (!home) + fatal("no $HOME !, do you live in a trailer ?"); + conf_biphome = malloc(strlen(home) + strlen("/.bip") + 1); + strcpy(conf_biphome, home); + strcat(conf_biphome, "/.bip"); + } + if (!conf_log_root) { + char *ap = "/logs"; + conf_log_root = malloc(strlen(conf_biphome) + strlen(ap) + 1); + strcpy(conf_log_root, conf_biphome); + strcat(conf_log_root, ap); + mylog(LOG_INFO, "Default log root: %s", conf_log_root); + } + if (!conf_pid_file) { + char *pid = "/bip.pid"; + conf_pid_file = malloc(strlen(conf_biphome) + strlen(pid) + 1); + strcpy(conf_pid_file, conf_biphome); + strcat(conf_pid_file, pid); + mylog(LOG_INFO, "Default pid file: %s", conf_pid_file); + } + +#ifdef HAVE_LIBSSL + conf_ssl_certfile = NULL; /* Make into a config option */ + if (!conf_ssl_certfile) { + char *home = getenv("HOME"); + char *ap = "/.bip/bip.pem"; + if (!home) + fatal("no $HOME !, do you live in a trailer ?"); + conf_ssl_certfile = malloc(strlen(home) + strlen(ap) + 1); + strcpy(conf_ssl_certfile, home); + strcat(conf_ssl_certfile, ap); + mylog(LOG_INFO, "Default SSL certificate file: %s", + conf_ssl_certfile); + } +#endif + if (!conf_log_format) + conf_log_format = "%u/%n/%Y-%m/%c.%d.log"; + return 1; +} + +void print_link(struct link *l) +{ + printf("\n"); +} + +void print_sumup(void) +{ + hash_iterator_t it; + for (hash_it_init(&adm_users, &it); hash_it_item(&it); + hash_it_next(&it)) { + hash_t *u = hash_it_item(&it); + char *uk = hash_it_key(&it); + + printf("user: %s", uk); + + hash_iterator_t sit; + for (hash_it_init(u, &sit); hash_it_item(&sit); + hash_it_next(&sit)) { + struct link *l = hash_it_item(&sit); + char *ck = hash_it_key(&sit); + printf(" connection: %s", ck); + print_link(l); + } + } +} + +void ircize(list_t *ll) +{ + hash_iterator_t it; + for (hash_it_init(&conf_users, &it); hash_it_item(&it); + hash_it_next(&it)) { + struct c_user *u = hash_it_item(&it); + + hash_t *adm_conn = hash_get(&adm_users, u->name); + if (!adm_conn) { + adm_conn = hash_new(HASH_NOCASE); + hash_insert(&adm_users, u->name, adm_conn); + mylog(LOG_DEBUG, "new user: \"%s\"", u->name); + } else { + mylog(LOG_DEBUG, "old user: \"%s\"", u->name); + } + + /* + * A user has multiple connections. + * For each connections create a irc_client and a irc_server + * instance and register them in connection structure; + */ + list_iterator_t cit; + for (list_it_init(&u->connectionl, &cit); list_it_item(&cit); + list_it_next(&cit)) { + struct c_connection *c = list_it_item(&cit); + struct link *link; + int i; + + if (!c->name) + fatal("no name for a connection"); + + link = hash_get(adm_conn, c->name); + if (!link) { + mylog(LOG_DEBUG, "new connection: \"%s\"", + c->name); + link = irc_link_new(); + hash_insert(adm_conn, c->name, link); + link->name = strmaydup(c->name); + link->log = log_new(u->name, link->name); + + list_iterator_t chit; + for (list_it_init(&c->channell, &chit); + list_it_item(&chit); + list_it_next(&chit)) { + struct c_channel *chan = + list_it_item(&chit); + struct chan_info *ci = chan_info_new(); + ci->name = strdup(chan->name); + ci->key = strmaydup(chan->key); + hash_insert(&link->chan_infos, + ci->name, ci); + } + list_add_last(ll, link); + } else { + mylog(LOG_DEBUG, "old connection: \"%s\"", + c->name); +#define MAYFREE(a) do { \ + if (a) { \ + free(a); \ + (a) = NULL; \ + } \ + } while(0); + MAYFREE(link->away_nick); + MAYFREE(link->login); + MAYFREE(link->password); + MAYFREE(link->user); + MAYFREE(link->real_name); + MAYFREE(link->s_password); + MAYFREE(link->connect_nick); + MAYFREE(link->vhost); + + for (i = 0; i < link->serverc; i++) + server_free(link->serverv[i]); + free(link->serverv); + link->serverv = NULL; + link->serverc = 0; + } + + link->follow_nick = c->follow_nick; + link->ignore_first_nick = c->ignore_first_nick; + link->on_connect_send = strmaydup(c->on_connect_send); + link->away_nick = strmaydup(c->away_nick); + + link->login = strmaydup(c->login); + link->password = malloc(20); + memcpy(link->password, u->password, 20); + link->seed = u->seed; + + list_iterator_t seit; + for (list_it_init(&c->network->serverl, &seit); + list_it_item(&seit); + list_it_next(&seit)) { + struct server *s = list_it_item(&seit); + link->serverv = realloc(link->serverv, + (link->serverc + 1) + * sizeof(struct server *)); + link->serverv[link->serverc] = server_new(); + /* XXX: wrong */ + link->serverv[link->serverc]->host + = strmaydup(s->host); + link->serverv[link->serverc]->port = s->port; + link->serverc++; + } + + link->user = strmaydup(c->user); + link->real_name = strmaydup(c->realname); + link->s_password = strmaydup(c->password); + link->connect_nick = strmaydup(c->nick); + + link->vhost = strmaydup(c->vhost); + link->bind_port = c->source_port; +#ifdef HAVE_LIBSSL + link->s_ssl = c->network->ssl; +#endif + + if (!link->user) + link->user = strmaydup("bip"); + if (!link->connect_nick) + link->connect_nick = strmaydup("bip"); + if (!link->real_name) + link->real_name = strmaydup("bip"); + + printf("clientc: %d\n", link->l_clientc); + } + } + print_sumup(); +} + +int main(int argc, char **argv) +{ + FILE *conf = NULL; + char *confpath = NULL; + list_t *ll = list_new(NULL); + int ch; + int r,fd; + char buf[30]; + + conf_ip = strdup("0.0.0.0"); + conf_port = 7778; + conf_css = 0; + + hash_init(&adm_users, HASH_NOCASE); + + hash_init(&conf_users, HASH_NOCASE); + hash_init(&conf_networks, HASH_NOCASE); + + signal(SIGPIPE, SIG_IGN); + signal(SIGHUP, reload_config); + signal(SIGINT, bad_quit); + signal(SIGQUIT, bad_quit); + signal(SIGTERM, bad_quit); + + conf_log_root = NULL; + conf_log_format = NULL; + conf_log_level = LOG_ERROR; + conf_no_backlog = 0; + conf_backlog_lines = 100; + conf_log_sync_interval = 5; + conf_daemonize = 1; + conf_global_log_file = stderr; + conf_pid_file = NULL; + + while ((ch = getopt(argc, argv, "hnf:")) != -1) { + switch (ch) { + case 'f': + confpath = strdup(optarg); + break; + case 'n': + conf_daemonize = 0; + break; + default: + usage(argv[0]); + } + } + if (confpath) { + conf = fopen(confpath, "r"); + if (!conf) + fatal("config file not found"); + } + if (!conf) { + char *home; + home = getenv("HOME"); + if (!home) + fatal("no home"); + confpath = malloc(strlen(home) + 1 + strlen(S_CONF) + 1); + *confpath = 0; + strcat(confpath, home); + strcat(confpath, "/"); + strcat(confpath, S_CONF); + conf = fopen(confpath, "r"); + if (!conf) + fatal("%s config file not found", confpath); + } + + r = fireup(conf); + fclose(conf); + if (!r) { + fatal("%s", conf_errstr); + exit(28); + } + + fd = do_pid_stuff(); + pid_t pid = 0; + if (conf_daemonize) + pid = daemonize(); + else + pid = getpid(); + snprintf(buf, 29, "%ld\n", (long unsigned int)pid); + write(fd, buf, strlen(buf)); + close(fd); + + connection_t *inc; + inc = listen_new(conf_ip, conf_port, conf_css); + if (!inc) + fatal("Could not create listening socket"); + + for (;;) { + if (r) + ircize(ll); + + irc_main(inc, ll); + + sighup = 0; + + conf = fopen(confpath, "r"); + if (!conf) + fatal("%s config file not found", confpath); + r = fireup(conf); + fclose(conf); + } + return 1; +} + +void write_user_list(connection_t *c, char *dest) +{ + hash_iterator_t it; + list_iterator_t lit; + + WRITE_LINE2(c, P_IRCMASK, "PRIVMSG", dest, "bip user list:"); + for (hash_it_init(&conf_users, &it); hash_it_item(&it); + hash_it_next(&it)) { + struct c_user *u = hash_it_item(&it); + + WRITE_LINE2(c, P_IRCMASK, "PRIVMSG", dest, u->name); + for (list_it_init(&u->connectionl, &lit); list_it_item(&lit); + list_it_next(&lit)) { + struct c_connection *con = list_it_item(&lit); + WRITE_LINE2(c, P_IRCMASK, "PRIVMSG", dest, con->name); + } + } + WRITE_LINE2(c, P_IRCMASK, "PRIVMSG", dest, + "end of bip user list"); +} + +extern struct link_client *reloading_client; + +void adm_bip(struct link_client *ic, struct line *line) +{ + char *nick; + if (LINK(ic)->l_server) + nick = LINK(ic)->l_server->nick; + else + nick = LINK(ic)->prev_nick; + if (line->elemc < 2) + return; + + if (strcasecmp(line->elemv[1], "RELOAD") == 0) { + reloading_client = ic; + sighup = 1; + } else if (strcasecmp(line->elemv[1], "LIST") == 0) { + write_user_list(CONN(ic), nick); + } else if (strcasecmp(line->elemv[1], "JUMP") == 0) { + if (LINK(ic)->l_server) { + WRITE_LINE1(CONN(LINK(ic)->l_server), NULL, "QUIT", + "jumpin' jumpin'"); + connection_close(CONN(LINK(ic)->l_server)); + } + } else if (strcasecmp(line->elemv[1], "HELP") == 0) { + WRITE_LINE2(CONN(ic), P_IRCMASK, "PRIVMSG", nick, + "/BIP (RELOAD|LIST|JUMP|HELP)"); + } +} + diff --git a/src/bip.h b/src/bip.h new file mode 100644 index 0000000..54fb295 --- /dev/null +++ b/src/bip.h @@ -0,0 +1,59 @@ +/* + * $Id: bip.h,v 1.6 2005/04/12 19:34:35 nohar Exp $ + * + * This file is part of the bip project + * Copyright (C) 2004 Arnaud Cornet and Loïc Gomez + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef BIP_H +#define BIP_H + +struct c_network +{ + char *name; +#ifdef HAVE_LIBSSL + int ssl; +#endif + list_t serverl; +}; + +struct c_user +{ + char *name; + unsigned char *password; + unsigned int seed; + list_t connectionl; +}; + +struct c_connection +{ + char *name; + struct c_network *network; + char *realname, *user, *nick; + char *login; /* connection id for a user */ + char *password; /* server pass */ + char *vhost; + unsigned short source_port; + list_t channell; + + int follow_nick; + int ignore_first_nick; + char *away_nick; + char *on_connect_send; + + struct client *client; +}; + +struct c_channel +{ + char *name; + char *key; +}; + +#endif diff --git a/src/conf.c b/src/conf.c new file mode 100644 index 0000000..d4f9dcb --- /dev/null +++ b/src/conf.c @@ -0,0 +1,1753 @@ +/* A Bison parser, made by GNU Bison 1.875d. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 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, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + LEX_IP = 258, + LEX_EQ = 259, + LEX_PORT = 260, + LEX_CSS = 261, + LEX_SEMICOLON = 262, + LEX_CONNECTION = 263, + LEX_NETWORK = 264, + LEX_LBRA = 265, + LEX_RBRA = 266, + LEX_USER = 267, + LEX_NAME = 268, + LEX_USERNAME = 269, + LEX_NICK = 270, + LEX_SERVER = 271, + LEX_PASSWORD = 272, + LEX_SRCIP = 273, + LEX_HOST = 274, + LEX_VHOST = 275, + LEX_SOURCE_PORT = 276, + LEX_NONE = 277, + LEX_COMMENT = 278, + LEX_BUNCH = 279, + LEX_REALNAME = 280, + LEX_SSL = 281, + LEX_CHANNEL = 282, + LEX_KEY = 283, + LEX_LOG_ROOT = 284, + LEX_LOG_FORMAT = 285, + LEX_LOG_LEVEL = 286, + LEX_BACKLOG_LINES = 287, + LEX_NO_BACKLOG = 288, + LEX_LOG_SYNC_INTERVAL = 289, + LEX_FOLLOW_NICK = 290, + LEX_ON_CONNECT_SEND = 291, + LEX_AWAY_NICK = 292, + LEX_PID_FILE = 293, + LEX_IGN_FIRST_NICK = 294, + LEX_ALWAYS_BACKLOG = 295, + LEX_LOGIN = 296, + LEX_BOOL = 297, + LEX_INT = 298, + LEX_STRING = 299 + }; +#endif +#define LEX_IP 258 +#define LEX_EQ 259 +#define LEX_PORT 260 +#define LEX_CSS 261 +#define LEX_SEMICOLON 262 +#define LEX_CONNECTION 263 +#define LEX_NETWORK 264 +#define LEX_LBRA 265 +#define LEX_RBRA 266 +#define LEX_USER 267 +#define LEX_NAME 268 +#define LEX_USERNAME 269 +#define LEX_NICK 270 +#define LEX_SERVER 271 +#define LEX_PASSWORD 272 +#define LEX_SRCIP 273 +#define LEX_HOST 274 +#define LEX_VHOST 275 +#define LEX_SOURCE_PORT 276 +#define LEX_NONE 277 +#define LEX_COMMENT 278 +#define LEX_BUNCH 279 +#define LEX_REALNAME 280 +#define LEX_SSL 281 +#define LEX_CHANNEL 282 +#define LEX_KEY 283 +#define LEX_LOG_ROOT 284 +#define LEX_LOG_FORMAT 285 +#define LEX_LOG_LEVEL 286 +#define LEX_BACKLOG_LINES 287 +#define LEX_NO_BACKLOG 288 +#define LEX_LOG_SYNC_INTERVAL 289 +#define LEX_FOLLOW_NICK 290 +#define LEX_ON_CONNECT_SEND 291 +#define LEX_AWAY_NICK 292 +#define LEX_PID_FILE 293 +#define LEX_IGN_FIRST_NICK 294 +#define LEX_ALWAYS_BACKLOG 295 +#define LEX_LOGIN 296 +#define LEX_BOOL 297 +#define LEX_INT 298 +#define LEX_STRING 299 + + + + +/* Copy the first part of user declarations. */ +#line 1 "conf.y" + +/* + * $Id: conf.y,v 1.26 2005/04/17 15:20:32 nohar Exp $ + * + * This file is part of the bip proproject + * Copyright (C) 2004 Arnaud Cornet + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#include +#include "util.h" +#include "irc.h" +#include "tuple.h" +extern int yylex (void); +extern char *yytext; +extern int linec; +extern int conf_error; +#define ERRBUFSZ 80 +extern char conf_errstr[ERRBUFSZ]; + +int yywrap() +{ + return 1; +} + +int yyerror() +{ + snprintf(conf_errstr, ERRBUFSZ, "Parse error near %s, line %d\n", + yytext, linec + 1); + conf_errstr[ERRBUFSZ - 1] = 0; + conf_error = 1; + return 1; +} + +int yydebug = 1; + +list_t *root_list; + +struct tuple *tuple_i_new(int type, int i) +{ + struct tuple *t; + t = malloc(sizeof(struct tuple)); + if (!t) + fatal("malloc"); + t->type = type; + t->ndata = i; + t->tuple_type = TUPLE_INT; + return t; +} + +struct tuple *tuple_p_new(int type, void *p) +{ + struct tuple *t; + t = malloc(sizeof(struct tuple)); + if (!t) + fatal("malloc"); + t->type = type; + t->pdata = p; + return t; +} + +struct tuple *tuple_s_new(int type, void *p) +{ + struct tuple *t = tuple_p_new(type, p); + t->tuple_type = TUPLE_STR; + return t; +} + +struct tuple *tuple_l_new(int type, void *p) +{ + struct tuple *t = tuple_p_new(type, p); + t->tuple_type = TUPLE_LIST; + return t; +} + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 84 "conf.y" +typedef union YYSTYPE { + int number; + char *string; + void *list; + struct tuple *tuple; +} YYSTYPE; +/* Line 191 of yacc.c. */ +#line 252 "y.tab.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 214 of yacc.c. */ +#line 264 "y.tab.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +# ifndef YYFREE +# define YYFREE free +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# endif + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# endif +# else +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short int yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short int yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 2 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 146 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 45 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 13 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 51 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 134 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 299 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned char yyprhs[] = +{ + 0, 0, 3, 4, 8, 12, 16, 20, 24, 28, + 32, 36, 40, 44, 48, 52, 57, 62, 63, 67, + 71, 75, 80, 81, 85, 89, 93, 98, 99, 103, + 107, 111, 115, 119, 123, 127, 131, 135, 139, 143, + 147, 151, 155, 160, 164, 165, 169, 173, 177, 178, + 182, 186 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 46, 0, -1, -1, 46, 47, 7, -1, 29, 4, + 44, -1, 30, 4, 44, -1, 31, 4, 43, -1, + 3, 4, 44, -1, 5, 4, 43, -1, 6, 4, + 42, -1, 32, 4, 43, -1, 33, 4, 42, -1, + 40, 4, 42, -1, 34, 4, 43, -1, 38, 4, + 44, -1, 9, 10, 48, 11, -1, 12, 10, 50, + 11, -1, -1, 48, 49, 7, -1, 13, 4, 44, + -1, 26, 4, 42, -1, 16, 10, 56, 11, -1, + -1, 50, 51, 7, -1, 13, 4, 44, -1, 17, + 4, 44, -1, 8, 10, 52, 11, -1, -1, 52, + 53, 7, -1, 13, 4, 44, -1, 9, 4, 44, + -1, 41, 4, 44, -1, 15, 4, 44, -1, 12, + 4, 44, -1, 25, 4, 44, -1, 17, 4, 44, + -1, 20, 4, 44, -1, 21, 4, 43, -1, 26, + 4, 42, -1, 37, 4, 44, -1, 35, 4, 42, + -1, 39, 4, 42, -1, 27, 10, 54, 11, -1, + 36, 4, 44, -1, -1, 54, 55, 7, -1, 13, + 4, 44, -1, 28, 4, 44, -1, -1, 56, 57, + 7, -1, 19, 4, 44, -1, 5, 4, 43, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned char yyrline[] = +{ + 0, 99, 99, 100, 104, 105, 107, 108, 109, 110, + 111, 113, 115, 117, 119, 120, 122, 125, 126, 129, + 130, 131, 135, 136, 139, 141, 143, 147, 148, 152, + 153, 155, 156, 157, 158, 160, 162, 163, 165, 166, + 168, 170, 172, 174, 177, 178, 181, 182, 185, 186, + 189, 190 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "LEX_IP", "LEX_EQ", "LEX_PORT", + "LEX_CSS", "LEX_SEMICOLON", "LEX_CONNECTION", "LEX_NETWORK", "LEX_LBRA", + "LEX_RBRA", "LEX_USER", "LEX_NAME", "LEX_USERNAME", "LEX_NICK", + "LEX_SERVER", "LEX_PASSWORD", "LEX_SRCIP", "LEX_HOST", "LEX_VHOST", + "LEX_SOURCE_PORT", "LEX_NONE", "LEX_COMMENT", "LEX_BUNCH", + "LEX_REALNAME", "LEX_SSL", "LEX_CHANNEL", "LEX_KEY", "LEX_LOG_ROOT", + "LEX_LOG_FORMAT", "LEX_LOG_LEVEL", "LEX_BACKLOG_LINES", "LEX_NO_BACKLOG", + "LEX_LOG_SYNC_INTERVAL", "LEX_FOLLOW_NICK", "LEX_ON_CONNECT_SEND", + "LEX_AWAY_NICK", "LEX_PID_FILE", "LEX_IGN_FIRST_NICK", + "LEX_ALWAYS_BACKLOG", "LEX_LOGIN", "LEX_BOOL", "LEX_INT", "LEX_STRING", + "$accept", "commands", "command", "network", "net_command", "user", + "usr_command", "connection", "con_command", "channel", "cha_command", + "server", "ser_command", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short int yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 45, 46, 46, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 48, 48, 49, + 49, 49, 50, 50, 51, 51, 51, 52, 52, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 54, 54, 55, 55, 56, 56, + 57, 57 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 0, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 4, 4, 0, 3, 3, + 3, 4, 0, 3, 3, 3, 4, 0, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 4, 3, 0, 3, 3, 3, 0, 3, + 3, 3 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 7, 8, 9, 0, 0, 4, 5, 6, 10, + 11, 13, 14, 12, 15, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 48, 0, 18, 27, 0, + 0, 23, 19, 0, 20, 0, 24, 25, 0, 21, + 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 44, 0, 0, 0, 0, 0, 28, 51, 50, + 30, 33, 29, 32, 35, 36, 37, 34, 38, 0, + 40, 43, 39, 41, 31, 42, 0, 0, 0, 0, + 0, 45, 46, 47 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const short int yydefgoto[] = +{ + -1, 1, 16, 34, 48, 35, 53, 65, 88, 119, + 128, 63, 71 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -10 +static const yysigned_char yypact[] = +{ + -10, 0, -10, 13, 14, 17, 12, 15, 20, 22, + 23, 24, 31, 32, 33, 40, 39, 4, 6, 10, + -10, -10, 9, 16, 11, 18, 21, 19, 26, 34, + -10, -10, -10, -10, -3, 3, -10, -10, -10, -10, + -10, -10, -10, -10, -10, 54, 49, 60, 61, 62, + -10, 69, 70, 68, 35, -10, 36, -10, -10, 37, + 38, -10, -10, -4, -10, 30, -10, -10, 73, -10, + 76, 77, 79, -10, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 50, + 56, -10, 57, 59, 63, 64, 65, 66, 71, 67, + 74, -10, 75, 78, 80, 96, 97, -10, -10, -10, + -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, + -10, -10, -10, -10, -10, -10, 100, 101, 99, 98, + 102, -10, -10, -10 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yysigned_char yypgoto[] = +{ + -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, + -10, -10, -10 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const unsigned char yytable[] = +{ + 2, 68, 125, 3, 126, 4, 5, 69, 44, 6, + 45, 49, 7, 46, 50, 70, 51, 17, 18, 127, + 52, 19, 20, 47, 22, 21, 23, 24, 25, 8, + 9, 10, 11, 12, 13, 26, 27, 28, 14, 72, + 15, 73, 74, 75, 29, 76, 30, 77, 31, 32, + 78, 79, 33, 36, 38, 80, 81, 82, 54, 55, + 37, 39, 41, 40, 56, 83, 84, 85, 57, 86, + 42, 87, 58, 59, 60, 61, 43, 89, 64, 62, + 90, 66, 67, 92, 91, 93, 94, 95, 96, 97, + 98, 99, 100, 108, 102, 103, 104, 105, 106, 101, + 109, 110, 107, 111, 129, 130, 131, 112, 113, 114, + 115, 117, 0, 0, 116, 0, 118, 120, 0, 0, + 0, 0, 121, 0, 122, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, + 0, 124, 132, 0, 0, 0, 133 +}; + +static const yysigned_char yycheck[] = +{ + 0, 5, 11, 3, 13, 5, 6, 11, 11, 9, + 13, 8, 12, 16, 11, 19, 13, 4, 4, 28, + 17, 4, 10, 26, 4, 10, 4, 4, 4, 29, + 30, 31, 32, 33, 34, 4, 4, 4, 38, 9, + 40, 11, 12, 13, 4, 15, 7, 17, 44, 43, + 20, 21, 42, 44, 43, 25, 26, 27, 4, 10, + 44, 43, 43, 42, 4, 35, 36, 37, 7, 39, + 44, 41, 10, 4, 4, 7, 42, 4, 42, 44, + 4, 44, 44, 4, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 43, 4, 4, 4, 4, 4, 10, + 44, 44, 7, 44, 4, 4, 7, 44, 44, 44, + 44, 44, -1, -1, 43, -1, 42, 42, -1, -1, + -1, -1, 44, -1, 44, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 42, -1, + -1, 44, 44, -1, -1, -1, 44 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 46, 0, 3, 5, 6, 9, 12, 29, 30, + 31, 32, 33, 34, 38, 40, 47, 4, 4, 4, + 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, + 7, 44, 43, 42, 48, 50, 44, 44, 43, 43, + 42, 43, 44, 42, 11, 13, 16, 26, 49, 8, + 11, 13, 17, 51, 4, 10, 4, 7, 10, 4, + 4, 7, 44, 56, 42, 52, 44, 44, 5, 11, + 19, 57, 9, 11, 12, 13, 15, 17, 20, 21, + 25, 26, 27, 35, 36, 37, 39, 41, 53, 4, + 4, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 10, 4, 4, 4, 4, 4, 7, 43, 44, + 44, 44, 44, 44, 44, 44, 43, 44, 42, 54, + 42, 44, 44, 42, 44, 11, 13, 28, 55, 4, + 4, 7, 44, 44 +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).first_line = (Rhs)[1].first_line, \ + (Current).first_column = (Rhs)[1].first_column, \ + (Current).last_line = (Rhs)[N].last_line, \ + (Current).last_column = (Rhs)[N].last_column) +#endif + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short int *bottom, short int *top) +#else +static void +yy_stack_print (bottom, top) + short int *bottom; + short int *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short int yyssa[YYINITDEPTH]; + short int *yyss = yyssa; + register short int *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short int *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short int *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 99 "conf.y" + { yyval.list = root_list = list_new(NULL); } + break; + + case 3: +#line 100 "conf.y" + { list_add_last(yyvsp[-2].list, yyvsp[-1].tuple); yyval.list = yyvsp[-2].list; } + break; + + case 4: +#line 104 "conf.y" + { yyval.tuple = tuple_s_new(LEX_LOG_ROOT, yyvsp[0].string); } + break; + + case 5: +#line 105 "conf.y" + { yyval.tuple = tuple_s_new(LEX_LOG_FORMAT, + yyvsp[0].string); } + break; + + case 6: +#line 107 "conf.y" + { yyval.tuple = tuple_i_new(LEX_LOG_LEVEL, yyvsp[0].number); } + break; + + case 7: +#line 108 "conf.y" + { yyval.tuple = tuple_s_new(LEX_IP, yyvsp[0].string); } + break; + + case 8: +#line 109 "conf.y" + { yyval.tuple = tuple_i_new(LEX_PORT, yyvsp[0].number); } + break; + + case 9: +#line 110 "conf.y" + { yyval.tuple = tuple_i_new(LEX_CSS, yyvsp[0].number); } + break; + + case 10: +#line 111 "conf.y" + { yyval.tuple = tuple_i_new(LEX_BACKLOG_LINES, + yyvsp[0].number); } + break; + + case 11: +#line 113 "conf.y" + { yyval.tuple = tuple_i_new(LEX_NO_BACKLOG, + yyvsp[0].number); } + break; + + case 12: +#line 115 "conf.y" + { yyval.tuple = tuple_i_new( + LEX_ALWAYS_BACKLOG, yyvsp[0].number); } + break; + + case 13: +#line 117 "conf.y" + { yyval.tuple = tuple_i_new( + LEX_LOG_SYNC_INTERVAL, yyvsp[0].number); } + break; + + case 14: +#line 119 "conf.y" + { yyval.tuple = tuple_s_new(LEX_PID_FILE, yyvsp[0].string); } + break; + + case 15: +#line 120 "conf.y" + { yyval.tuple = tuple_l_new(LEX_NETWORK, + yyvsp[-1].list); } + break; + + case 16: +#line 122 "conf.y" + { yyval.tuple = tuple_l_new(LEX_USER, yyvsp[-1].list); } + break; + + case 17: +#line 125 "conf.y" + { yyval.list = list_new(NULL); } + break; + + case 18: +#line 126 "conf.y" + { list_add_last(yyvsp[-2].list, yyvsp[-1].tuple); yyval.list = yyvsp[-2].list; } + break; + + case 19: +#line 129 "conf.y" + { yyval.tuple = tuple_s_new(LEX_NAME, yyvsp[0].string); } + break; + + case 20: +#line 130 "conf.y" + { yyval.tuple = tuple_i_new(LEX_SSL, yyvsp[0].number); } + break; + + case 21: +#line 131 "conf.y" + { + yyval.tuple = tuple_l_new(LEX_SERVER, yyvsp[-1].list); } + break; + + case 22: +#line 135 "conf.y" + { yyval.list = list_new(NULL); } + break; + + case 23: +#line 136 "conf.y" + { list_add_last(yyvsp[-2].list, yyvsp[-1].tuple); yyval.list = yyvsp[-2].list; } + break; + + case 24: +#line 139 "conf.y" + { + yyval.tuple = tuple_s_new(LEX_NAME, yyvsp[0].string); } + break; + + case 25: +#line 141 "conf.y" + { yyval.tuple = tuple_s_new(LEX_PASSWORD, + yyvsp[0].string); } + break; + + case 26: +#line 143 "conf.y" + { + yyval.tuple = tuple_l_new(LEX_CONNECTION, yyvsp[-1].list); } + break; + + case 27: +#line 147 "conf.y" + { yyval.list = list_new(NULL); } + break; + + case 28: +#line 148 "conf.y" + { + list_add_last(yyvsp[-2].list, yyvsp[-1].tuple); yyval.list = yyvsp[-2].list; } + break; + + case 29: +#line 152 "conf.y" + { yyval.tuple = tuple_s_new(LEX_NAME, yyvsp[0].string); } + break; + + case 30: +#line 153 "conf.y" + { yyval.tuple = tuple_s_new(LEX_NETWORK, + yyvsp[0].string); } + break; + + case 31: +#line 155 "conf.y" + { yyval.tuple = tuple_s_new(LEX_LOGIN, yyvsp[0].string); } + break; + + case 32: +#line 156 "conf.y" + { yyval.tuple = tuple_s_new(LEX_NICK, yyvsp[0].string); } + break; + + case 33: +#line 157 "conf.y" + { yyval.tuple = tuple_s_new(LEX_USER, yyvsp[0].string); } + break; + + case 34: +#line 158 "conf.y" + { yyval.tuple = tuple_s_new(LEX_REALNAME, + yyvsp[0].string); } + break; + + case 35: +#line 160 "conf.y" + { yyval.tuple = tuple_s_new(LEX_PASSWORD, + yyvsp[0].string); } + break; + + case 36: +#line 162 "conf.y" + { yyval.tuple = tuple_s_new(LEX_VHOST, yyvsp[0].string); } + break; + + case 37: +#line 163 "conf.y" + { + yyval.tuple = tuple_i_new(LEX_SOURCE_PORT, yyvsp[0].number); } + break; + + case 38: +#line 165 "conf.y" + { yyval.tuple = tuple_i_new(LEX_SSL, yyvsp[0].number); } + break; + + case 39: +#line 166 "conf.y" + { yyval.tuple = tuple_s_new(LEX_AWAY_NICK, + yyvsp[0].string); } + break; + + case 40: +#line 168 "conf.y" + { + yyval.tuple = tuple_i_new(LEX_FOLLOW_NICK, yyvsp[0].number); } + break; + + case 41: +#line 170 "conf.y" + { yyval.tuple = tuple_i_new( + LEX_IGN_FIRST_NICK, yyvsp[0].number); } + break; + + case 42: +#line 172 "conf.y" + { yyval.tuple = tuple_l_new( + LEX_CHANNEL, yyvsp[-1].list); } + break; + + case 43: +#line 174 "conf.y" + { yyval.tuple = tuple_s_new( + LEX_ON_CONNECT_SEND, yyvsp[0].string); } + break; + + case 44: +#line 177 "conf.y" + { yyval.list = list_new(NULL); } + break; + + case 45: +#line 178 "conf.y" + { list_add_last(yyvsp[-2].list, yyvsp[-1].tuple); yyval.list = yyvsp[-2].list; } + break; + + case 46: +#line 181 "conf.y" + { yyval.tuple = tuple_s_new(LEX_NAME, yyvsp[0].string); } + break; + + case 47: +#line 182 "conf.y" + { yyval.tuple = tuple_s_new(LEX_KEY, yyvsp[0].string); } + break; + + case 48: +#line 185 "conf.y" + { yyval.list = list_new(NULL); } + break; + + case 49: +#line 186 "conf.y" + { list_add_last(yyvsp[-2].list, yyvsp[-1].tuple); yyval.list = yyvsp[-2].list; } + break; + + case 50: +#line 189 "conf.y" + { yyval.tuple = tuple_s_new(LEX_HOST, yyvsp[0].string); } + break; + + case 51: +#line 190 "conf.y" + { yyval.tuple = tuple_i_new(LEX_PORT, yyvsp[0].number); } + break; + + + } + +/* Line 1010 of yacc.c. */ +#line 1529 "y.tab.c" + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + const char* yyprefix; + char *yymsg; + int yyx; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); + yycount += 1; + if (yycount == 5) + { + yysize = 0; + break; + } + } + yysize += (sizeof ("syntax error, unexpected ") + + yystrlen (yytname[yytype])); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yyp = yystpcpy (yyp, yyprefix); + yyp = yystpcpy (yyp, yytname[yyx]); + yyprefix = " or "; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("syntax error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror ("syntax error"); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (yychar == YYEOF) + for (;;) + { + YYPOPSTACK; + if (yyssp == yyss) + YYABORT; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + } + } + else + { + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); + yychar = YYEMPTY; + + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + +#ifdef __GNUC__ + /* Pacify GCC when the user code never invokes YYERROR and the label + yyerrorlab therefore never appears in user code. */ + if (0) + goto yyerrorlab; +#endif + + yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; + + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + + diff --git a/src/conf.h b/src/conf.h new file mode 100644 index 0000000..1932f58 --- /dev/null +++ b/src/conf.h @@ -0,0 +1,140 @@ +/* A Bison parser, made by GNU Bison 1.875d. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 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, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + LEX_IP = 258, + LEX_EQ = 259, + LEX_PORT = 260, + LEX_CSS = 261, + LEX_SEMICOLON = 262, + LEX_CONNECTION = 263, + LEX_NETWORK = 264, + LEX_LBRA = 265, + LEX_RBRA = 266, + LEX_USER = 267, + LEX_NAME = 268, + LEX_USERNAME = 269, + LEX_NICK = 270, + LEX_SERVER = 271, + LEX_PASSWORD = 272, + LEX_SRCIP = 273, + LEX_HOST = 274, + LEX_VHOST = 275, + LEX_SOURCE_PORT = 276, + LEX_NONE = 277, + LEX_COMMENT = 278, + LEX_BUNCH = 279, + LEX_REALNAME = 280, + LEX_SSL = 281, + LEX_CHANNEL = 282, + LEX_KEY = 283, + LEX_LOG_ROOT = 284, + LEX_LOG_FORMAT = 285, + LEX_LOG_LEVEL = 286, + LEX_BACKLOG_LINES = 287, + LEX_NO_BACKLOG = 288, + LEX_LOG_SYNC_INTERVAL = 289, + LEX_FOLLOW_NICK = 290, + LEX_ON_CONNECT_SEND = 291, + LEX_AWAY_NICK = 292, + LEX_PID_FILE = 293, + LEX_IGN_FIRST_NICK = 294, + LEX_ALWAYS_BACKLOG = 295, + LEX_LOGIN = 296, + LEX_BOOL = 297, + LEX_INT = 298, + LEX_STRING = 299 + }; +#endif +#define LEX_IP 258 +#define LEX_EQ 259 +#define LEX_PORT 260 +#define LEX_CSS 261 +#define LEX_SEMICOLON 262 +#define LEX_CONNECTION 263 +#define LEX_NETWORK 264 +#define LEX_LBRA 265 +#define LEX_RBRA 266 +#define LEX_USER 267 +#define LEX_NAME 268 +#define LEX_USERNAME 269 +#define LEX_NICK 270 +#define LEX_SERVER 271 +#define LEX_PASSWORD 272 +#define LEX_SRCIP 273 +#define LEX_HOST 274 +#define LEX_VHOST 275 +#define LEX_SOURCE_PORT 276 +#define LEX_NONE 277 +#define LEX_COMMENT 278 +#define LEX_BUNCH 279 +#define LEX_REALNAME 280 +#define LEX_SSL 281 +#define LEX_CHANNEL 282 +#define LEX_KEY 283 +#define LEX_LOG_ROOT 284 +#define LEX_LOG_FORMAT 285 +#define LEX_LOG_LEVEL 286 +#define LEX_BACKLOG_LINES 287 +#define LEX_NO_BACKLOG 288 +#define LEX_LOG_SYNC_INTERVAL 289 +#define LEX_FOLLOW_NICK 290 +#define LEX_ON_CONNECT_SEND 291 +#define LEX_AWAY_NICK 292 +#define LEX_PID_FILE 293 +#define LEX_IGN_FIRST_NICK 294 +#define LEX_ALWAYS_BACKLOG 295 +#define LEX_LOGIN 296 +#define LEX_BOOL 297 +#define LEX_INT 298 +#define LEX_STRING 299 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 84 "conf.y" +typedef union YYSTYPE { + int number; + char *string; + void *list; + struct tuple *tuple; +} YYSTYPE; +/* Line 1285 of yacc.c. */ +#line 132 "y.tab.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +extern YYSTYPE yylval; + + + diff --git a/src/conf.y b/src/conf.y new file mode 100644 index 0000000..27a5f29 --- /dev/null +++ b/src/conf.y @@ -0,0 +1,190 @@ +%{ +/* + * $Id: conf.y,v 1.26 2005/04/17 15:20:32 nohar Exp $ + * + * This file is part of the bip proproject + * Copyright (C) 2004 Arnaud Cornet + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#include +#include "util.h" +#include "irc.h" +#include "tuple.h" +extern int yylex (void); +extern char *yytext; +extern int linec; +extern int conf_error; +#define ERRBUFSZ 80 +extern char conf_errstr[ERRBUFSZ]; + +int yywrap() +{ + return 1; +} + +int yyerror() +{ + snprintf(conf_errstr, ERRBUFSZ, "Parse error near %s, line %d\n", + yytext, linec + 1); + conf_errstr[ERRBUFSZ - 1] = 0; + conf_error = 1; + return 1; +} + +int yydebug = 1; + +list_t *root_list; + +struct tuple *tuple_i_new(int type, int i) +{ + struct tuple *t; + t = malloc(sizeof(struct tuple)); + if (!t) + fatal("malloc"); + t->type = type; + t->ndata = i; + t->tuple_type = TUPLE_INT; + return t; +} + +struct tuple *tuple_p_new(int type, void *p) +{ + struct tuple *t; + t = malloc(sizeof(struct tuple)); + if (!t) + fatal("malloc"); + t->type = type; + t->pdata = p; + return t; +} + +struct tuple *tuple_s_new(int type, void *p) +{ + struct tuple *t = tuple_p_new(type, p); + t->tuple_type = TUPLE_STR; + return t; +} + +struct tuple *tuple_l_new(int type, void *p) +{ + struct tuple *t = tuple_p_new(type, p); + t->tuple_type = TUPLE_LIST; + return t; +} +%} + +%token LEX_IP LEX_EQ LEX_PORT LEX_CSS LEX_SEMICOLON LEX_CONNECTION LEX_NETWORK LEX_LBRA LEX_RBRA LEX_USER LEX_NAME LEX_USERNAME LEX_NICK LEX_SERVER LEX_PASSWORD LEX_SRCIP LEX_HOST LEX_VHOST LEX_SOURCE_PORT LEX_NONE LEX_COMMENT LEX_BUNCH LEX_REALNAME LEX_SSL LEX_CHANNEL LEX_KEY LEX_LOG_ROOT LEX_LOG_FORMAT LEX_LOG_LEVEL LEX_BACKLOG_LINES LEX_NO_BACKLOG LEX_LOG_SYNC_INTERVAL LEX_FOLLOW_NICK LEX_ON_CONNECT_SEND LEX_AWAY_NICK LEX_PID_FILE LEX_IGN_FIRST_NICK LEX_ALWAYS_BACKLOG LEX_LOGIN + +%union { + int number; + char *string; + void *list; + struct tuple *tuple; +} + +%token LEX_BOOL LEX_INT +%token LEX_STRING + +%type commands server network channel user connection +%type command ser_command net_command cha_command usr_command con_command +%% + +commands: + { $$ = root_list = list_new(NULL); } + | commands command LEX_SEMICOLON { list_add_last($1, $2); $$ = $1; } + ; + +command: + LEX_LOG_ROOT LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_LOG_ROOT, $3); } + | LEX_LOG_FORMAT LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_LOG_FORMAT, + $3); } + | LEX_LOG_LEVEL LEX_EQ LEX_INT { $$ = tuple_i_new(LEX_LOG_LEVEL, $3); } + | LEX_IP LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_IP, $3); } + | LEX_PORT LEX_EQ LEX_INT { $$ = tuple_i_new(LEX_PORT, $3); } + | LEX_CSS LEX_EQ LEX_BOOL { $$ = tuple_i_new(LEX_CSS, $3); } + | LEX_BACKLOG_LINES LEX_EQ LEX_INT { $$ = tuple_i_new(LEX_BACKLOG_LINES, + $3); } + | LEX_NO_BACKLOG LEX_EQ LEX_BOOL { $$ = tuple_i_new(LEX_NO_BACKLOG, + $3); } + | LEX_ALWAYS_BACKLOG LEX_EQ LEX_BOOL { $$ = tuple_i_new( + LEX_ALWAYS_BACKLOG, $3); } + | LEX_LOG_SYNC_INTERVAL LEX_EQ LEX_INT { $$ = tuple_i_new( + LEX_LOG_SYNC_INTERVAL, $3); } + | LEX_PID_FILE LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_PID_FILE, $3); } + | LEX_NETWORK LEX_LBRA network LEX_RBRA { $$ = tuple_l_new(LEX_NETWORK, + $3); } + | LEX_USER LEX_LBRA user LEX_RBRA { $$ = tuple_l_new(LEX_USER, $3); } + +network: + { $$ = list_new(NULL); } + | network net_command LEX_SEMICOLON { list_add_last($1, $2); $$ = $1; } + +net_command: + LEX_NAME LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_NAME, $3); } + | LEX_SSL LEX_EQ LEX_BOOL { $$ = tuple_i_new(LEX_SSL, $3); } + | LEX_SERVER LEX_LBRA server LEX_RBRA { + $$ = tuple_l_new(LEX_SERVER, $3); } + +user: + { $$ = list_new(NULL); } + | user usr_command LEX_SEMICOLON { list_add_last($1, $2); $$ = $1; } + +usr_command: + LEX_NAME LEX_EQ LEX_STRING { + $$ = tuple_s_new(LEX_NAME, $3); } + | LEX_PASSWORD LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_PASSWORD, + $3); } + | LEX_CONNECTION LEX_LBRA connection LEX_RBRA { + $$ = tuple_l_new(LEX_CONNECTION, $3); } + +connection: + { $$ = list_new(NULL); } + | connection con_command LEX_SEMICOLON { + list_add_last($1, $2); $$ = $1; } + +con_command: + LEX_NAME LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_NAME, $3); } + | LEX_NETWORK LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_NETWORK, + $3); } + | LEX_LOGIN LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_LOGIN, $3); } + | LEX_NICK LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_NICK, $3); } + | LEX_USER LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_USER, $3); } + | LEX_REALNAME LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_REALNAME, + $3); } + | LEX_PASSWORD LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_PASSWORD, + $3); } + | LEX_VHOST LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_VHOST, $3); } + | LEX_SOURCE_PORT LEX_EQ LEX_INT { + $$ = tuple_i_new(LEX_SOURCE_PORT, $3); } + | LEX_SSL LEX_EQ LEX_BOOL { $$ = tuple_i_new(LEX_SSL, $3); } + | LEX_AWAY_NICK LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_AWAY_NICK, + $3); } + | LEX_FOLLOW_NICK LEX_EQ LEX_BOOL { + $$ = tuple_i_new(LEX_FOLLOW_NICK, $3); } + | LEX_IGN_FIRST_NICK LEX_EQ LEX_BOOL { $$ = tuple_i_new( + LEX_IGN_FIRST_NICK, $3); } + | LEX_CHANNEL LEX_LBRA channel LEX_RBRA { $$ = tuple_l_new( + LEX_CHANNEL, $3); } + | LEX_ON_CONNECT_SEND LEX_EQ LEX_STRING { $$ = tuple_s_new( + LEX_ON_CONNECT_SEND, $3); } +channel: + { $$ = list_new(NULL); } + | channel cha_command LEX_SEMICOLON { list_add_last($1, $2); $$ = $1; } + +cha_command: + LEX_NAME LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_NAME, $3); } + | LEX_KEY LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_KEY, $3); } + +server: + { $$ = list_new(NULL); } + | server ser_command LEX_SEMICOLON { list_add_last($1, $2); $$ = $1; } + +ser_command: + LEX_HOST LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_HOST, $3); } + | LEX_PORT LEX_EQ LEX_INT { $$ = tuple_i_new(LEX_PORT, $3); } diff --git a/src/config.h.in b/src/config.h.in new file mode 100644 index 0000000..4473cc3 --- /dev/null +++ b/src/config.h.in @@ -0,0 +1,29 @@ +/* src/config.h.in. Generated from configure.in by autoheader. */ + +/* Define to 1 if you have the `ssl' library (-lssl). */ +#undef HAVE_LIBSSL + +/* 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 version of this package. */ +#undef PACKAGE_VERSION + +/* Version number of package */ +#undef VERSION + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#undef YYTEXT_POINTER diff --git a/src/connection.c b/src/connection.c new file mode 100644 index 0000000..faf09b2 --- /dev/null +++ b/src/connection.c @@ -0,0 +1,1279 @@ +/* + * $Id: connection.c,v 1.98 2005/04/12 19:34:35 nohar Exp $ + * + * This file is part of the bip project + * Copyright (C) 2004 Arnaud Cornet and Loïc Gomez + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "config.h" +#include +#include +#include "connection.h" + +extern int errno; +#ifdef HAVE_LIBSSL +static SSL_CTX *sslctx = NULL; +static BIO *errbio = NULL; +extern char *conf_ssl_certfile; +static int SSLize(connection_t *cn); +static int SSL_init_context(void); +#endif + +static int connection_timedout(connection_t *cn); +static int socket_set_nonblock(int s); + +struct connecting_data +{ + struct addrinfo *dst; + struct addrinfo *src; + struct addrinfo *cur; +}; + +static void connecting_data_free(struct connecting_data *t) +{ + if (t->dst) + freeaddrinfo(t->dst); + if (t->src) + freeaddrinfo(t->src); + free(t); +} + +void connection_close(connection_t *cn) +{ + mylog(LOG_DEBUG, "Connection close asked. FD:%d ", (long)cn->handle); + cn->connected = CONN_DISCONN; + shutdown(cn->handle, SHUT_RDWR); + close(cn->handle); +} + +void connection_free(connection_t *cn) +{ + connection_close(cn); + + if (cn->outgoing) { + char *l; + while ((l = list_remove_first(cn->outgoing))) + free(l); + list_free(cn->outgoing); + } + if (cn->incoming_lines) + list_free(cn->incoming_lines); + if (cn->incoming) + free(cn->incoming); + if (cn->ip_list) + list_free(cn->ip_list); + if (cn->connecting_data) + connecting_data_free(cn->connecting_data); + /* conn->user_data */ +#ifdef HAVE_LIBSSL + if (cn->ssl) { + if (cn->cert) { + X509_free(cn->cert); + cn->cert = NULL; + } + if (cn->ssl_h) { + SSL_shutdown(cn->ssl_h); + SSL_free(cn->ssl_h); + cn->ssl_h = NULL; + } + } +#endif + free(cn); +} + +/* XXX + * m'expliquer le local bind + * API Suxor + */ +static void connect_trynext(connection_t *cn) +{ + struct addrinfo *cur; + int err; + + if (!cn->connecting_data) + fatal("called connect_trynext with a connection not " + "connecting\n"); + + cur = cn->connecting_data->cur; + + for (cur = cn->connecting_data->cur ; cur ; cur = cur->ai_next) { + if ((cn->handle = socket(cur->ai_family, cur->ai_socktype, + cur->ai_protocol)) < 0) { + mylog(LOG_WARN, "socket() : %s", strerror(errno)); + continue; + } + + socket_set_nonblock(cn->handle); + + if (cn->connecting_data->src) { + /* local bind */ + err = bind(cn->handle, + cn->connecting_data->src->ai_addr, + cn->connecting_data->src->ai_addrlen); + if (err == -1) + mylog(LOG_WARN, "bind() before connect: %s", + strerror(errno)); + } + + err = connect(cn->handle, cur->ai_addr, cur->ai_addrlen); + if (err == -1 && errno == EINPROGRESS) { + /* ok for now, see later */ + /* next time try the next in the list */ + cn->connecting_data->cur = cur->ai_next; + cn->connect_time = time(NULL); + cn->connected = CONN_INPROGRESS; + return; + } + + if (!err) { + /* connect() successful */ + connecting_data_free(cn->connecting_data); + cn->connecting_data = NULL; + cn->connected = cn->ssl ? CONN_NEED_SSLIZE : CONN_OK; + return; + } + + /* connect() failed */ + char ip[256]; + mylog(LOG_WARN, "connect(%s) : %s", + inet_ntop(cur->ai_family, cur->ai_addr, ip, 256), + strerror(errno)); + close(cn->handle); + cn->handle = -1; + } + + cn->connected = CONN_ERROR; + connecting_data_free(cn->connecting_data); + cn->connecting_data = NULL; + mylog(LOG_ERROR, "connect() failed."); +} + +#ifdef HAVE_LIBSSL +static X509 *mySSL_get_cert(SSL *ssl) +{ + X509 *cert; + + if (!ssl) { + mylog(LOG_WARN, "mySSL_get_cert() No SSL context"); + return NULL; + } + cert = SSL_get_peer_certificate(ssl); + if (cert == NULL) + mylog(LOG_WARN, "mySSL_get_cert() SSL server supplied no " + "certificate !"); + return cert; +} + +static int _write_socket_SSL(connection_t *cn, char* message) +{ + int count, size; + + size = sizeof(char)*strlen(message); + + if (!cn->client && cn->cert == NULL) { + cn->cert = mySSL_get_cert(cn->ssl_h); + if (cn->cert == NULL) { + mylog(LOG_ERROR, "No certificate in SSL write_socket"); + return WRITE_ERROR; + } + } + count = SSL_write(cn->ssl_h, (const void *)message, size); + ERR_print_errors(errbio); + if (count <= 0) { + int err = SSL_get_error(cn->ssl_h, count); + if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE + || err == SSL_ERROR_WANT_CONNECT + || err == SSL_ERROR_WANT_ACCEPT) + return WRITE_KEEP; + if (cn_is_connected(cn)) { + mylog(LOG_DEBUG, "fd %d: Connection error", cn->handle); + cn->connected = CONN_ERROR; + } + return WRITE_ERROR; + } + if (count != size) { + /* abnormal : openssl keeps writing until message is not fully + * sent */ + mylog(LOG_DEBUG, "only %d written while message length is %d", + count,size); + } + + mylog(LOG_DEBUGVERB, "%d/%d bytes sent", count, size); + return WRITE_OK; +} +#endif + +static int _write_socket(connection_t *cn, char* message) +{ + size_t size; + size_t tcount = 0; + ssize_t count; + + size = sizeof(char) * strlen(message); + while ((count = write(cn->handle, ((const char*)message) + tcount, + size - tcount)) > 0) { + tcount += count; + if (tcount == size) + break; + } + if (count <= 0) { + /* + * if no fatal error, return WRITE_KEEP, which makes caller + * keep line in its FIFO + */ + if (errno == EAGAIN || errno == EINTR || errno == EINPROGRESS) + return WRITE_KEEP; + + if (cn_is_connected(cn)) { + mylog(LOG_DEBUG, "write(fd %d) : %s", cn->handle, + strerror(errno)); + cn->connected = CONN_ERROR; + } + mylog(LOG_DEBUG, "write : %s", strerror(errno)); + return WRITE_ERROR; + } + mylog(LOG_DEBUGVERB, "%d/%d bytes sent !", tcount, size); + return WRITE_OK; +} + +static int write_socket(connection_t *cn, char *line) +{ +#ifdef HAVE_LIBSSL + if (cn->ssl) + return _write_socket_SSL(cn, line); + else +#endif + return _write_socket(cn, line); + +} + +/* returns 1 if connection must be notified */ +static int real_write_all(connection_t *cn) +{ + int ret; + char *line; + + if (cn == NULL) + fatal("real_write_all: wrong arguments"); + + while ((line = list_remove_first(cn->outgoing))) { + ret = write_socket(cn, line); + + switch (ret) { + case WRITE_ERROR: + return 1; + case WRITE_KEEP: + /* interrupted or not ready */ + list_add_first(cn->outgoing, line); + return 0; + case WRITE_OK: + free(line); + break; + default: + fatal("internal error 6"); + break; + } + + if (cn->anti_flood) + /* one line at a time */ + break; + } + return 0; +} + +void write_line_fast(connection_t *cn, char *line) +{ + int r; + r = write_socket(cn, line); + switch (r) { + case WRITE_KEEP: + list_add_first(cn->outgoing, strdup(line)); + break; + case WRITE_ERROR: + cn->connected = CONN_ERROR; + break; + case WRITE_OK: + break; + default: + fatal("internal error 7"); + break; + } +} + +void write_line(connection_t *cn, char *line) +{ + list_add_last(cn->outgoing, strdup(line)); +} + +list_t *read_lines(connection_t *cn, int *error) +{ + list_t *ret = NULL; + + switch (cn->connected) { + case CONN_TIMEOUT: + case CONN_ERROR: + case CONN_DISCONN: + case CONN_EXCEPT: + *error = 1; + ret = NULL; + break; + case CONN_NEW: + case CONN_INPROGRESS: + case CONN_NEED_SSLIZE: + *error = 0; + ret = NULL; + break; + case CONN_OK: + *error = 0; + ret = cn->incoming_lines; + cn->incoming_lines = NULL; + break; + default: + fatal("internal error 8"); + break; + } + return ret; +} + +#ifdef HAVE_LIBSSL +/* returns 1 if connection must be notified */ +static int read_socket_SSL(connection_t *cn) +{ + int max, count; + + max = CONN_BUFFER_SIZE - cn->incoming_end; + if (!cn->client && cn->cert == NULL) { + cn->cert = mySSL_get_cert(cn->ssl_h); + if (cn->cert == NULL) { + mylog(LOG_ERROR, "No certificate in SSL read_socket"); + return -1; + } + } + count = SSL_read(cn->ssl_h, (void *)cn->incoming + cn->incoming_end, + sizeof(char) * max); + ERR_print_errors(errbio); + if (count < 0) { + int err = SSL_get_error(cn->ssl_h, count); + if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE + || err == SSL_ERROR_WANT_CONNECT + || err == SSL_ERROR_WANT_ACCEPT) + return 0; + if (cn_is_connected(cn)) { + mylog(LOG_DEBUG, "fd %d: Connection error",cn->handle); + cn->connected = CONN_ERROR; + } + return 1; + } else if (count == 0) { +/* int err = SSL_get_error(cn->ssl_h,count); + if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE + || err == SSL_ERROR_WANT_CONNECT + || err == SSL_ERROR_WANT_ACCEPT) + return 0;*/ + if (cn_is_connected(cn)) { + mylog(LOG_DEBUG, "fd %d: Connection lost",cn->handle); + cn->connected = CONN_DISCONN; + } + return 1; + } + + cn->incoming_end += count; + return 0; +} +#endif + +/* returns 1 if connection must be notified */ +static int read_socket(connection_t *cn) +{ + int max, count; + + if (cn == NULL) + return 0; + max = CONN_BUFFER_SIZE - cn->incoming_end; + count = read(cn->handle, cn->incoming+cn->incoming_end, + sizeof(char)*max); + if (count < 0) { + if (errno == EAGAIN || errno == EINTR || errno == EINPROGRESS) + return 0; + if (cn_is_connected(cn)) { + mylog(LOG_DEBUG, "fd %d: Connection error",cn->handle); + mylog(LOG_DEBUG, "fd %d: read() %s", cn->handle, + strerror(errno)); + cn->connected = CONN_ERROR; + } + return 1; + } else if (count == 0) { + if (cn_is_connected(cn)) { + mylog(LOG_DEBUG, "fd %d: Connection lost", cn->handle); + cn->connected = CONN_DISCONN; + mylog(LOG_DEBUG, "fd %d: read() %s", cn->handle, + strerror(errno)); + } + return 1; + } + + cn->incoming_end += count; + return 0; +} + +static void data_find_lines(connection_t *cn) +{ + size_t len = 0, lastlen = 0, ssz; + char *p = cn->incoming; + char *buf; + + for (;;) { + while (len < cn->incoming_end && p[len] != '\n') + len++; + if (len >= cn->incoming_end || p[len] != '\n') + break; + + ssz = len - lastlen; + if (ssz >= 1) { + if (p[len - 1] == '\r') + ssz--; + buf = malloc(ssz + 1); + memcpy(buf, p + lastlen, ssz); + buf[ssz] = 0; + + list_add_last(cn->incoming_lines, buf); + } + + len++; + lastlen = len; + } + if (lastlen) { + unsigned i; + for (i = 0; i < cn->incoming_end - lastlen; i++) + p[i] = p[i + lastlen]; + cn->incoming_end -= lastlen; + } +} + +int cn_is_new(connection_t *cn) +{ + switch (cn->connected) { + case CONN_TIMEOUT: + case CONN_ERROR: + case CONN_DISCONN: + case CONN_EXCEPT: + case CONN_NEED_SSLIZE: + case CONN_OK: + return 0; + case CONN_NEW: + case CONN_INPROGRESS: + return 1; + default: + fatal("internal error 9"); + return 0; + } +} + +int cn_is_in_error(connection_t *cn) +{ + switch (cn->connected) { + case CONN_TIMEOUT: + case CONN_ERROR: + case CONN_DISCONN: + case CONN_EXCEPT: + return 1; + case CONN_NEW: + case CONN_INPROGRESS: + case CONN_NEED_SSLIZE: + case CONN_OK: + return 0; + default: + fatal("internal error 10"); + return 1; + } +} + +int cn_is_connected(connection_t *cn) +{ + if (cn == NULL) + fatal("cn_is_connected, wrong argument"); + return (cn->connected == CONN_OK ? 1 : 0); +} + +static int check_event_except(fd_set *fds, connection_t *cn) +{ + if (!cn_is_connected(cn)) + return 0; + + if (cn_is_in_error(cn)) { + mylog(LOG_DEBUGVERB, "Error on fd %d (state %d)", + cn->handle, cn->connected); + return 1; + } + + if (!FD_ISSET(cn->handle, fds)) + return 0; + + mylog(LOG_DEBUG,"fd %d is in exceptions list", cn->handle); + cn->connected = CONN_EXCEPT; + return 1; +} + +static int check_event_read(fd_set *fds, connection_t *cn) +{ + int ret; + + if (cn_is_in_error(cn)) { + mylog(LOG_DEBUGVERB, "Error on fd %d (state %d)", + cn->handle, cn->connected); + return 1; + } + + if (!FD_ISSET(cn->handle, fds)) + return 0; + + mylog(LOG_DEBUGVERB, "Read positif sur fd %d (state %d)", cn->handle, + cn->connected); + + /* notify caller to make it check for a new client */ + if (cn->listening) + return 1; + +#ifdef HAVE_LIBSSL + if (cn->ssl) + ret = read_socket_SSL(cn); + else +#endif + ret = read_socket(cn); + + if (ret) { + mylog(LOG_DEBUGVERB, "Error while reading on fd %d", + cn->handle); + return 1; + } + + if (!cn->incoming_lines) + cn->incoming_lines = list_new(NULL); + data_find_lines(cn); + if (list_is_empty(cn->incoming_lines)) + return 0; + + mylog(LOG_DEBUGVERB, "newlines sur fd %d (state %d)", cn->handle, + cn->connected); + return 1; +} + +static int check_event_write(fd_set *fds, connection_t *cn) +{ + if (cn_is_in_error(cn)) { + mylog(LOG_DEBUGVERB, "Error on fd %d (state %d)", + cn->handle, cn->connected); + return 1; + } + + if (!FD_ISSET(cn->handle, fds)) { + if (cn_is_connected(cn)) + return 0; + + mylog(LOG_DEBUGVERB, "New socket still not connected (%d)", + cn->handle); + /* check timeout (handles connect_trynext) */ + return connection_timedout(cn); + } + + mylog(LOG_DEBUGVERB, "Write positif sur fd %d (state %d)", + cn->handle, cn->connected); + + if (cn_is_new(cn)) { + int err, err2; + socklen_t errSize = sizeof(err); + + err2 = getsockopt(cn->handle,SOL_SOCKET,SO_ERROR,(void *)&err, + &errSize); + + if (err2 < 0) { + mylog(LOG_WARN, "fd:%d getsockopt error: %s", + cn->handle, strerror(errno)); + connect_trynext(cn); + return (cn_is_new(cn) || cn->connected == + CONN_NEED_SSLIZE) ? 0 : 1; + + } else if (err == EINPROGRESS || err == EALREADY) { + mylog(LOG_INFO, "fd:%d Connection in progress...", + cn->handle); + return connection_timedout(cn); + } else if (err == EISCONN || err == 0) { +#ifdef HAVE_LIBSSL + if (cn->ssl) { + cn->connected = CONN_NEED_SSLIZE; + return 0; + } +#endif + cn->connected = CONN_OK; + mylog(LOG_INFO, "fd:%d Connection established !", + cn->handle); + return 1; + } else { + mylog(LOG_WARN, "fd:%d Socket error: %s", cn->handle, + strerror(err)); + connect_trynext(cn); + return (cn_is_new(cn) || cn->connected == + CONN_NEED_SSLIZE) ? 0 : 1; + } + } + +#ifdef HAVE_LIBSSL + if (cn->connected == CONN_NEED_SSLIZE) { + if (SSLize(cn)) + return connection_timedout(cn); + return 0; + } +#endif + + if (cn_is_connected(cn) && !list_is_empty(cn->outgoing)) + real_write_all(cn); + + return 0; +} + +static void connection_ready_output(connection_t *c) +{ +} + +/* starts empty */ +/* capacity: 4 token */ +#define TOKEN_MAX 4 +/* token generation interval: 1200ms */ +#define TOKEN_INTERVAL 1200 + +int cn_want_write(connection_t *cn) +{ + if (cn->anti_flood) { + struct timeval tv; + unsigned long now; + + /* fill the bucket */ + /* we do not control when we are called */ + /* now is the number of milliseconds since the Epoch, + * cn->lasttoken is the number of milliseconds when we + * last added a token to the bucket */ + if (!gettimeofday(&tv, NULL)) { + now = tv.tv_sec * 1000 + tv.tv_usec / 1000; + /* round now to TOKEN_INTERVAL multiple */ + now -= now % TOKEN_INTERVAL; + if (now < cn->lasttoken) { + /* time shift or integer overflow */ + cn->token = 1; + cn->lasttoken = now; + } else if (now > cn->lasttoken + TOKEN_INTERVAL) { + /* there may be an overflow here + * but the impact is insignificant */ + cn->token += (now - cn->lasttoken) / + TOKEN_INTERVAL; + if (cn->token > TOKEN_MAX) + cn->token = TOKEN_MAX; + cn->lasttoken = now; + } + } else + /* if gettimeofday() fails, juste ignore + * antiflood */ + cn->token = 1; + + /* use a token if needed and available */ + if (!list_is_empty(cn->outgoing) && cn->token > 0) { + cn->token--; + return 1; + } + return 0; + } + return !list_is_empty(cn->outgoing); +} + +list_t *wait_event(list_t *cn_list, int *msec) +{ + fd_set fds_read, fds_write, fds_except; + int maxfd = -1, err; + list_t *cn_newdata; + list_iterator_t it; + struct timeval tv; + struct timeval btv, etv; + + cn_newdata = list_new(NULL); + FD_ZERO(&fds_read); + FD_ZERO(&fds_write); + FD_ZERO(&fds_except); + for (list_it_init(cn_list, &it); list_it_item(&it); list_it_next(&it)) { + connection_t *cn = list_it_item(&it); + if (cn == NULL) + fatal("wait_event: wrong argument"); + + mylog(LOG_DEBUGTOOMUCH, "I've seen socket %d !", cn->handle); + if (cn->connected == CONN_DISCONN) { + list_add_first(cn_newdata, cn); + continue; + } + + /* + * This shouldn't happen ! just in case... + */ + if (cn->handle < 0) { + mylog(LOG_DEBUG, "wait_event invalid socket %d", + cn->handle); + if (cn_is_connected(cn)) + cn->connected = CONN_ERROR; + continue; + } + + /* exceptions are OOB and disconnections */ + FD_SET(cn->handle, &fds_except); + maxfd = (cn->handle > maxfd ? cn->handle : maxfd); + + /* + * if connected, we're looking for new incoming data + * if new or lines waiting to be sent, we want + * to know if it's ready or not. + */ + if (cn_is_connected(cn)) { + FD_SET(cn->handle, &fds_read); + mylog(LOG_DEBUGVERB, "Test read sur fd %d %d:%d", + cn->handle, cn->connected, + cn_is_connected(cn)); + } + + /* we NEVER want to check write on a listening socket */ + if (cn->listening) + continue; + + if (!cn_is_connected(cn) || cn_want_write(cn)) { + FD_SET(cn->handle, &fds_write); + mylog(LOG_DEBUGVERB, "Test write sur fd %d %d:%d", + cn->handle, cn->connected, + cn_is_connected(cn)); + } + } + + /* if no connection is active, return the list... empty... */ + if (maxfd == -1) + return cn_newdata; + + tv.tv_sec = *msec / 1000; + tv.tv_usec = (*msec % 1000) * 1000; + gettimeofday(&btv, NULL); + mylog(LOG_DEBUGVERB,"msec: %d, sec: %d, usec: %d", *msec, tv.tv_sec, + tv.tv_usec); + err = select(maxfd + 1, &fds_read, &fds_write, &fds_except, &tv); + gettimeofday(&etv, NULL); + + if (etv.tv_sec < btv.tv_sec) + mylog(LOG_ERROR, "Time rewinded ! not touching interval"); + else + *msec -= (etv.tv_sec - btv.tv_sec) * 1000 + + (etv.tv_usec - btv.tv_usec) / 1000; + /* in case we go forward in time */ + if (*msec < 0) + *msec = 0; + mylog(LOG_DEBUGVERB,"msec: %d, sec: %d, usec: %d", *msec, tv.tv_sec, + tv.tv_usec); + if (err < 0) { + if (errno == EINTR) + return cn_newdata; + fatal("select(): %s", strerror(errno)); + } else if (err == 0) { + mylog(LOG_DEBUGTOOMUCH, "Select timed-out. irc.o timer !"); + /* select timed-out */ + return cn_newdata; + } + + for (list_it_init(cn_list, &it); list_it_item(&it); list_it_next(&it)) { + connection_t *cn = list_it_item(&it); + + if (check_event_except(&fds_except, cn)) { + mylog(LOG_DEBUGVERB,"Notify on FD %d (state %d)", + cn->handle, cn->connected); + list_add_first(cn_newdata, cn); + continue; + } + if (check_event_write(&fds_write, cn)) + connection_ready_output(cn); + + if (check_event_read(&fds_read, cn)) { + mylog(LOG_DEBUGVERB, "Notify on FD %d (state %d)", + cn->handle, cn->connected); + list_add_first(cn_newdata, cn); + } + } + return cn_newdata; +} + +static void create_socket(char *dsthostname, char *dstport, char *srchostname, + char *srcport, connection_t *cn) +{ + int err; + struct connecting_data *cdata; + struct addrinfo hint; + + memset(&hint, 0, sizeof(hint)); + hint.ai_flags = AI_PASSIVE; + hint.ai_family = PF_UNSPEC; + hint.ai_socktype = SOCK_STREAM; + hint.ai_protocol = 0; + + cn->connected = CONN_ERROR; + cdata = (struct connecting_data *) + malloc(sizeof(struct connecting_data)); + if (!cdata) { + mylog(LOG_ERROR, "malloc() : %s", strerror(errno)); + return; + } + cdata->dst = cdata->src = cdata->cur = NULL; + + err = getaddrinfo(dsthostname, dstport, &hint, &cdata->dst); + if (err) { + mylog(LOG_ERROR, "getaddrinfo(dst): %s", gai_strerror(err)); + connecting_data_free(cdata); + cdata = NULL; + return; + } + + if (srchostname || srcport) { + if ((err = getaddrinfo(srchostname, srcport, &hint, + &cdata->src))) { + /* not fatal ? maybe a config option is needed */ + mylog(LOG_WARN, "getaddrinfo(src): %s", + gai_strerror(err)); + cdata->src = NULL; + } + } + + cdata->cur = cdata->dst; + cn->connecting_data = cdata; + + connect_trynext(cn); +} + + +static void create_listening_socket(char *hostname, char *port, + connection_t *cn) +{ + int multi_client = 1; + int err; + struct addrinfo *res, *cur; + struct addrinfo hint = { + .ai_flags = AI_PASSIVE, + .ai_family = PF_UNSPEC, + .ai_socktype = SOCK_STREAM, + .ai_protocol = 0, + + .ai_addrlen = 0, + .ai_addr = 0, + .ai_canonname = 0, + .ai_next = 0 + }; + + cn->connected = CONN_ERROR; + + err = getaddrinfo(hostname, port, &hint, &res); + if (err) { + mylog(LOG_ERROR, "getaddrinfo(): %s", gai_strerror(err)); + return; + } + + for (cur = res ; cur ; cur = cur->ai_next) { + if ((cn->handle = socket(cur->ai_family, cur->ai_socktype, + cur->ai_protocol)) < 0) { + mylog(LOG_WARN, "socket : %s", strerror(errno)); + continue; + } + + if (setsockopt(cn->handle, SOL_SOCKET, SO_REUSEADDR, + (char *)&multi_client, + sizeof(multi_client)) < 0) { + mylog(LOG_WARN, "setsockopt() : %s", strerror(errno)); + close(cn->handle); + cn->handle = -1; + continue; + } + + socket_set_nonblock(cn->handle); + + if (bind(cn->handle, cur->ai_addr, cur->ai_addrlen) < 0) { + mylog(LOG_WARN, "bind() : %s", strerror(errno)); + close(cn->handle); + cn->handle = -1; + continue; + } + + err = listen(cn->handle, 1024); + if (err == -1) { + mylog(LOG_WARN, "listen() : %s", strerror(errno)); + close(cn->handle); + cn->handle = -1; + continue; + } + + freeaddrinfo(res); + cn->connected = CONN_OK; + return; + } + freeaddrinfo(res); + mylog(LOG_ERROR, "Unable to bind/listen"); + cn->connected = CONN_ERROR; +} + +static connection_t *connection_init(int anti_flood, int ssl, int timeout, + int listen) +{ + connection_t *conn; + char *incoming; + list_t *outgoing, *incoming_lines; + + conn = (connection_t*)malloc(sizeof(connection_t)); + incoming = (char*)malloc(sizeof(char) * CONN_BUFFER_SIZE); + outgoing = list_new(NULL); + incoming_lines = list_new(NULL); + + conn->anti_flood = anti_flood; + conn->ssl = ssl; + conn->lasttoken = 0; + conn->token = TOKEN_MAX; + conn->timeout = (listen ? 0 : timeout); + conn->connect_time = 0; + conn->incoming = incoming; + conn->incoming_end = 0; + conn->outgoing = outgoing; + conn->incoming_lines = NULL; + conn->user_data = NULL; + conn->listening = listen; + conn->handle = -1; + conn->client = 0; + conn->ip_list = NULL; + conn->connecting_data = NULL; +#ifdef HAVE_LIBSSL + conn->ssl_h = NULL; + conn->cert = NULL; +#endif + conn->connected = CONN_NEW; + + return conn; +} + +connection_t *accept_new(connection_t *cn) +{ + connection_t *conn; + int err; + socklen_t sa_len = sizeof (struct sockaddr); + struct sockaddr sa; + + mylog(LOG_DEBUG, "Trying to accept new client on %d", cn->handle); + err = accept(cn->handle, &sa, &sa_len); + if (err < 0) + return NULL; + socket_set_nonblock(err); + + conn = connection_init(cn->anti_flood, cn->ssl, cn->timeout, 0); + conn->connect_time = time(NULL); + conn->user_data = cn->user_data; + conn->handle = err; + conn->client = 1; +#ifdef HAVE_LIBSSL + if (cn->ssl) { + if (!sslctx) { + mylog(LOG_DEBUG, "No SSL context availaible. " + "Initializing..."); + if (SSL_init_context()) { + mylog(LOG_DEBUG, "SSL context initialization " + "failed"); + connection_free(conn); + return NULL; + } + } + + conn->ssl_h = SSL_new(sslctx); + if (!conn->ssl_h) { + connection_free(conn); + return NULL; + } + SSL_set_accept_state(conn->ssl_h); + } +#endif + mylog(LOG_DEBUG, "New client on socket %d !",conn->handle); + + return conn; +} + +connection_t *listen_new(char *hostname, int port, int ssl) +{ + connection_t *conn; + char portbuf[20]; + /* TODO: allow litteral service name in the function interface */ + if (snprintf(portbuf, 20, "%d", port) >= 20) + portbuf[19] = '\0'; + + /* + * SSL flag is only here to tell program to convert socket to SSL after + * accept(). Listening socket will NOT be SSL + */ + conn = connection_init(0, ssl, 0, 1); + create_listening_socket(hostname, portbuf, conn); + + return conn; +} + +static connection_t *_connection_new(char *dsthostname, char *dstport, + char *srchostname, char *srcport, int timeout) +{ + connection_t *conn; + + printf("%s\n", dsthostname); + + conn = connection_init(1, 0, timeout, 0); + create_socket(dsthostname, dstport, srchostname, srcport, conn); + + return conn; +} + +#ifdef HAVE_LIBSSL +static int SSL_init_context(void) +{ + int fd, flags, ret, rng; + char buf[1025]; + + if (sslctx) { + mylog(LOG_DEBUG, "SSL already initialized"); + return 0; + } + + SSL_library_init(); + SSL_load_error_strings(); + errbio = BIO_new_fp(stderr,BIO_NOCLOSE); + + /* allocated by function */ + sslctx = SSL_CTX_new(SSLv23_method()); + if (!sslctx) + return 1; + if (!SSL_CTX_use_certificate_chain_file(sslctx,conf_ssl_certfile)) { + mylog(LOG_DEBUG, "SSL: Unable to load certificate file"); + } + if (!SSL_CTX_use_PrivateKey_file(sslctx, conf_ssl_certfile, + SSL_FILETYPE_PEM)) { + mylog(LOG_DEBUG, "SSL: Unable to load key file"); + } + SSL_CTX_set_session_cache_mode(sslctx, SSL_SESS_CACHE_BOTH); + SSL_CTX_set_timeout(sslctx,(long)60); + SSL_CTX_set_options(sslctx, SSL_OP_ALL); + flags = O_RDONLY; + flags |= O_NONBLOCK; + fd = open("/dev/random", flags); + if (fd < 0) { + mylog(LOG_DEBUG, "SSL: /dev/random not ready, unable to " + "manually seed PRNG."); + goto prng_end; + } + + do { + ret = read(fd, buf, 1024); + if (ret <= 0) { + mylog(LOG_DEBUG,"/dev/random: %s",strerror(errno)); + goto prng_end; + } + mylog(LOG_DEBUG, "PRNG seeded with %d /dev/random bytes", + ret); + RAND_seed(buf, ret); + } while (!(rng = RAND_status())); + +prng_end: + do { + ret = close(fd); + } while (ret != 0 && errno == EINTR); + if (RAND_status()) { + mylog(LOG_DEBUG, "SSL: PRNG is seeded !"); + } else { + mylog(LOG_WARN, "SSL: PRNG is not seeded enough"); + mylog(LOG_WARN, " OpenSSL will use /dev/urandom if " + "available."); + } + return 0; +} + +static int SSLize(connection_t *cn) +{ + int err, err2; + + if (cn == NULL) + return 1; + + if (cn->listening) { + mylog(LOG_DEBUG, "Can't use SSL with listening socket."); + return 0; + } + + if (!SSL_set_fd(cn->ssl_h,cn->handle)) { + mylog(LOG_DEBUG, "unable to associate FD to SSL structure"); + return 1; + } + + if (cn->client) + err = SSL_accept(cn->ssl_h); + else + err = SSL_connect(cn->ssl_h); + + err2 = SSL_get_error(cn->ssl_h, err); + ERR_print_errors(errbio); + + if (err2 == SSL_ERROR_NONE) { + SSL_CIPHER *cipher; + char buf[128]; + int len; + + cipher = SSL_get_current_cipher(cn->ssl_h); + SSL_CIPHER_description(cipher, buf, 128); + len = strlen(buf); + if (len > 0) + buf[len-1] = '\0'; + mylog(LOG_DEBUG, "Negociated cyphers: %s",buf); +/* if (SSL_get_verify_result(cn->ssl_h) != X509_V_OK) { + mylog(LOG_ERROR, "Invalid certificate !"); + cn->connected = CONN_ERROR; + return 1; + }*/ + cn->connected = CONN_OK; + return 0; + } + if (err2 == SSL_ERROR_ZERO_RETURN || err2 == SSL_ERROR_SSL) { + mylog(LOG_DEBUG, "Error in SSL handshake."); + cn->connected = CONN_ERROR; + return 1; + } + return 0; +} + +static connection_t *_connection_new_SSL(char *dsthostname, char *dstport, + char *srchostname, char *srcport, int timeout) +{ + connection_t *conn; + + conn = connection_init(1, 1, timeout, 0); + if (!sslctx) { + mylog(LOG_DEBUG, "No SSL context availaible. Initializing..."); + if (SSL_init_context()) { + mylog(LOG_DEBUG, "SSL context initialization failed"); + return conn; + } + } + conn->cert = NULL; + conn->ssl_h = SSL_new(sslctx); + if (conn->ssl_h == NULL) { + mylog(LOG_DEBUG, "Unable to allocate SSL structures"); + return conn; + } + + if (sslctx->session_cache_head) + if (!SSL_set_session(conn->ssl_h, sslctx->session_cache_head)) + mylog(LOG_DEBUG, "unable to set SSL session id to" + " most recent used"); + SSL_set_connect_state(conn->ssl_h); + + create_socket(dsthostname, dstport, srchostname, srcport, conn); + + return conn; +} +#endif + +connection_t *connection_new(char *dsthostname, int dstport, char *srchostname, + int srcport, int ssl, int timeout) +{ + char dstportbuf[20], srcportbuf[20], *tmp; + /* TODO: allow litteral service name in the function interface */ + if (snprintf(dstportbuf, 20, "%d", dstport) >= 20) + dstportbuf[19] = '\0'; + if (srcport) { + if (snprintf(srcportbuf, 20, "%d", srcport) >= 20) + srcportbuf[19] = '\0'; + tmp = srcportbuf; + } else + tmp = NULL; + +#ifdef HAVE_LIBSSL + if (ssl) + return _connection_new_SSL(dsthostname, dstportbuf, srchostname, + tmp, timeout); + else +#endif + return _connection_new(dsthostname, dstportbuf, srchostname, + tmp, timeout); +} + +int cn_is_listening(connection_t *cn) +{ + if (cn == NULL) + return 0; + else + return cn->listening; +} + +/* returns 1 if connection must be notified */ +static int connection_timedout(connection_t *cn) +{ + if (cn_is_connected(cn) || !cn->timeout) + return 0; + + if (!cn->connecting_data) + fatal("connection_timedout called with no connecting_data!\n"); + + if (time(NULL)-cn->connect_time > cn->timeout) { + /* connect() completion timed out */ + connect_trynext(cn); + if (!cn_is_new(cn) && cn->connected != CONN_NEED_SSLIZE) + return 1; + } + return 0; +} + +static int socket_set_nonblock(int s) +{ + if (fcntl(s, F_SETFL, O_NONBLOCK) < 0) { + mylog(LOG_ERROR, "Cannot set socket %d to non blocking : %s", + s, strerror(errno)); + return 0; + } + return 1; +} + +#ifdef TEST +int main(int argc,char* argv[]) +{ + connection_t *conn, *conn2; + int s, cont = 1; + + if (argc != 3) { + fprintf(stderr,"Usage: %s host port\n",argv[0]); + exit(1); + } + conn = connection_init(0, 0, 0, 1); + conn->connect_time = time(NULL); + create_listening_socket(argv[1],argv[2],&conn); + if (s == -1) { + mylog(LOG_ERROR, "socket() : %s", strerror(errno)); + exit(1); + } + mylog(LOG_DEBUG, "Socket number %d",s); + + while (cont) { + conn2 = accept_new(conn); + if (conn2) { + mylog(LOG_INFO, "New client"); + cont = 0; + } + sleep(1); + } + while (1) { + int ret = read_socket(conn2); + mylog(LOG_DEBUG, "READ: %d %*s",ret, conn2->incoming, + conn2->incoming_end); + conn2->incoming_end = 0; + sleep(1); + } + return 0; +} +#endif + diff --git a/src/connection.h b/src/connection.h new file mode 100644 index 0000000..c6f8cae --- /dev/null +++ b/src/connection.h @@ -0,0 +1,97 @@ +/* + * $Id: connection.h,v 1.40 2005/04/12 19:34:35 nohar Exp $ + * + * This file is part of the bip project + * Copyright (C) 2004 Arnaud Cornet and Loïc Gomez + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef CONNECTION_H +#define CONNECTION_H +#include "util.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifdef HAVE_LIBSSL +#include +#include +#include +#include +#include +#include +#include +#endif + +#define CONN_BUFFER_SIZE 2048 + +#define CONN_OK 1 +#define CONN_TIMEOUT 2 +#define CONN_ERROR 3 +#define CONN_INPROGRESS 4 +#define CONN_DISCONN 5 +#define CONN_EXCEPT 6 +#define CONN_NEW 7 +#define CONN_NEED_SSLIZE 8 + +#define WRITE_OK 0 +#define WRITE_ERROR -1 +#define WRITE_KEEP -2 + +struct connecting_data; +typedef struct connection { + int anti_flood; + int ssl; + unsigned long lasttoken; + unsigned token; + int handle; + int connected; + int listening; + int client; + time_t connect_time; + time_t timeout; + char *incoming; + unsigned incoming_end; + list_t *outgoing; + list_t *incoming_lines; + void *user_data; + list_t *ip_list; + struct connecting_data *connecting_data; +#ifdef HAVE_LIBSSL + SSL *ssl_h; + X509 *cert; +#endif +} connection_t; + +connection_t *connection_new(char *dsthostname, int dstport, char *srchostname, + int srcport, int ssl, int timeout); +connection_t *listen_new(char *hostname, int port, int ssl); +connection_t *accept_new(connection_t *cn); +void connection_free(connection_t *cn); +void connection_close(connection_t *cn); + +void write_line(connection_t *cn, char *line); +void write_line_fast(connection_t *cn, char *line); +list_t *read_lines(connection_t *cn, int *error); +list_t *wait_event(list_t *cn_list, int *msec); + +int cn_is_connected(connection_t *cn); +int cn_is_listening(connection_t *cn); +#endif diff --git a/src/genpwent.c b/src/genpwent.c new file mode 100644 index 0000000..d6bbc6a --- /dev/null +++ b/src/genpwent.c @@ -0,0 +1,37 @@ +#include "config.h" +#include +#include +#include "util.h" +#include "md5.h" + +int conf_log_level; +FILE *conf_global_log_file; + +int main(int argc, char **argv) +{ + int i; + char *ret; + char str[256]; + unsigned char *md5; + unsigned int seed; + + srand(time(NULL)); + printf("Enter password:\n"); + ret = fgets(str, 256, stdin); + srand(time(NULL)); + if (!ret) + return 1; + for (i = 0; i < 256 && str[i] != '\n'; i++) + ; + if (i >= 256) + return 2; + str[i] = 0; + + seed = rand(); + md5 = chash_double(str, seed); + for (i = 0; i < 20; i++) + printf("%02x", md5[i]); + printf("\n"); + free(md5); + return 0; +} diff --git a/src/irc.c b/src/irc.c new file mode 100644 index 0000000..ed7e328 --- /dev/null +++ b/src/irc.c @@ -0,0 +1,2067 @@ +/* + * $Id: irc.c,v 1.156 2005/04/21 06:58:50 nohar Exp $ + * + * This file is part of the bip project + * Copyright (C) 2004 Arnaud Cornet and Loïc Gomez + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "config.h" +#include +#include +#include +#include "util.h" +#include "irc.h" +#include "log.h" +#include "connection.h" +#include "md5.h" + +extern int sighup; + +static int irc_join(struct link_server *server, struct line *line); +static int irc_part(struct link_server *server, struct line *line); +static int irc_mode(struct link_server *server, struct line *line); +static int irc_kick(struct link_server *server, struct line *line); +static int irc_privmsg(struct link_server *server, struct line *line); +static int irc_notice(struct link_server *server, struct line *line); +static int irc_quit(struct link_server *server, struct line *line); +static int irc_nick(struct link_server *server, struct line *line); +static int irc_generic_quit(struct link_server *server, struct line *line); +static int irc_topic(struct link_server *server, struct line *line); +static int irc_332(struct link_server *server, struct line *line); +static int irc_333(struct link_server *server, struct line *line); +static int irc_353(struct link_server *server, struct line *line); +static int irc_366(struct link_server *server, struct line *line); +void irc_server_shutdown(struct link_server *s); + +void irc_client_free(struct link_client *cli); +static char *make_irc_mask(char *nick, char *oldim); +extern int conf_no_backlog; +extern int conf_log_sync_interval; +extern int conf_error; +extern char conf_errstr[]; + +void write_user_list(connection_t *c, char *dest); + +#define LAGOUT_TIME (360) +#define LAGCHECK_TIME (90) +#define RECONN_TIMER (30) +#define LOGGING_TIMEOUT (360) +#define CONN_INTERVAL 60 +#define CONNECT_TIMEOUT 60 + + +#define ERR_PROTOCOL (-1) +#define ERR_AUTH (-2) +#define OK_COPY (1) +#define OK_FORGET (2) +#define OK_CLOSE (3) +#define OK_COPY_CLI (4) + +struct channel *channel_new(const char *name) +{ + struct channel *chan; + chan = calloc(sizeof(struct channel), 1); + if (!chan) + fatal("calloc"); + chan->name = strdup(name); + hash_init(&chan->nicks, HASH_NOCASE); + return chan; +} + +static char *make_irc_mask(char *nick, char *oldim) +{ + char *nm; + char *imaskend = oldim; + while (*imaskend && *imaskend != '!') + imaskend++; + if (*imaskend == '\0') + imaskend = "!bip@bip.bip.bip"; + + nm = malloc(strlen(nick) + strlen(imaskend) + 1); + *nm = 0; + strcat(nm, nick); + strcat(nm, imaskend); + return nm; +} + +char *nick_from_ircmask(char *mask) +{ + char *nick = mask; + char *ret; + size_t len; + while (*nick && *nick != '!') + nick++; + if (!*nick) + return strdup(mask); + len = nick - mask; + ret = malloc(len + 1); + if (!ret) + fatal("malloc"); + memcpy(ret, mask, len); + ret[len] = 0; + return ret; +} + +static int is_irc_mask(char *mask) +{ + while (*mask && *mask != '!') + mask++; + if (*mask == 0) + return 0; + while (*mask && *mask != '@') + mask++; + if (*mask == 0) + return 0; + return 1; +} + +static void set_ircmask(struct link_server *server, char *ircmask) +{ + if (!is_irc_mask(ircmask)) + return; + if (server->irc_mask) + free(server->irc_mask); + server->irc_mask = strdup(ircmask); +} + +#define NAMESIZE 256 + +list_t *channel_name_list(struct channel *c) +{ + list_t *ret; + hash_iterator_t hi; + size_t s = NAMESIZE; + ret = list_new(NULL); + + size_t len = 0; + char *str = malloc(NAMESIZE); + *str = 0; + for (hash_it_init(&c->nicks, &hi); hash_it_item(&hi); + hash_it_next(&hi)){ + struct nick *n = hash_it_item(&hi); + + if (strlen(n->name) + 2 >= NAMESIZE) + fatal("nick too big for me"); /* FIXME */ + + if (len + strlen(n->name) + 2 + (n->ovmask ? 1 : 0) + >= NAMESIZE) { + list_add_last(ret, str); + str = malloc(s); + *str = 0; + len = 0; + } + if (len != 0) { + strncat(str, " ", NAMESIZE); + len++; + } + if (n->ovmask == NICKOP) { + strncat(str, "@", NAMESIZE); + len++; + } else if (n->ovmask == NICKVOICED) { + strncat(str, "+", NAMESIZE); + len++; + } + strncat(str, n->name, NAMESIZE); + len += strlen(n->name); + if (len >= NAMESIZE) + fatal("internal error 5"); + } + list_add_last(ret, str); + return ret; +} + +static int irc_001(struct link_server *server, struct line *line) +{ + int ret = OK_FORGET; + char *p, *ps, *pe; + size_t len; + char *ircmask, *oldircmask; + + if (LINK(server)->s_state == IRCS_WAS_CONNECTED) + LINK(server)->s_state = IRCS_RECONNECTING; + else + LINK(server)->s_state = IRCS_CONNECTING; + + if (line->elemc != 3) + return ERR_PROTOCOL; + + ps = pe = line->elemv[2]; + pe += strlen(pe); + p = strrchr(ps, ' '); + if (!p) + return ERR_PROTOCOL; + p++; + + len = pe - p; + ircmask = malloc(len + 1); + if (!ircmask) + fatal("malloc"); + memcpy(ircmask, p, len); + ircmask[len] = 0; + + oldircmask = server->irc_mask; + server->irc_mask = NULL; + set_ircmask(server, ircmask); + if (server->irc_mask == NULL) + server->irc_mask = make_irc_mask(server->nick, ""); + + /* 001 means the nick we sent is accepted by server, inform clients */ + if (oldircmask && LINK(server)->s_state == IRCS_RECONNECTING && + LINK(server)->prev_nick) { + if (strcmp(LINK(server)->prev_nick, server->nick) != 0) { + /* + * Inform connected clients that server<->proxy + * disconnection resulted in nick change + * sadly the oldircmask info is a guess only + */ + int i; + for (i = 0; i < LINK(server)->l_clientc; i++) { + struct link_client *c = + LINK(server)->l_clientv[i]; + WRITE_LINE1(CONN(c), oldircmask, "NICK", + server->nick); + } + } + } + if (LINK(server)->prev_nick) + free(LINK(server)->prev_nick); + LINK(server)->prev_nick = strdup(server->nick); + + if (oldircmask) + free(oldircmask); + free(ircmask); + return ret; +} + +void irc_start_lagtest(struct link_server *l) +{ + l->laginit_ts = time(NULL); + write_line_fast(CONN(l), "PING :" S_PING "\r\n"); +} + +/* + * returns 0 if we ping timeout + */ +void irc_compute_lag(struct link_server *is) +{ + if (is->laginit_ts == -1) + fatal("irc_compute_lag"); + + is->lag = time(NULL) - is->laginit_ts; +} + +int irc_lags_out(struct link_server *is) +{ + if (is->lag > LAGOUT_TIME) { + mylog(LOG_ERROR, "%s Lags out! closing", LINK(is)->name); + return 1; + } else { + mylog(LOG_DEBUG, "%s lag : %d\n", LINK(is)->name, is->lag); + return 0; + } +} + +void irc_lag_init(struct link_server *is) +{ + is->lagtest_timeout = LAGCHECK_TIME; + is->laginit_ts = -1; +} + +static void irc_server_join(struct link_server *s) +{ + hash_iterator_t it; + for (hash_it_init(&LINK(s)->chan_infos, &it); hash_it_item(&it); + hash_it_next(&it)) { + struct chan_info *ci = hash_it_item(&it); + if (!ci->key) + WRITE_LINE1(CONN(s), NULL, "JOIN", ci->name); + else + WRITE_LINE2(CONN(s), NULL, "JOIN", ci->name, ci->key); + } +} + +static void irc_server_connected(struct link_server *server) +{ + LINK(server)->s_state = IRCS_CONNECTED; + irc_server_join(server); + log_connected(LINK(server)->log); + + if (LINK(server)->on_connect_send) { + ssize_t len = strlen(LINK(server)->on_connect_send) + 2; + char *str = malloc(len + 1); + sprintf(str, "%s\r\n", LINK(server)->on_connect_send); + write_line(CONN(server), str); + free(str); + } +} + +/* + * Given the way irc nets disrespect the rfc, maybe we should completely forget + * about this damn ircmask... +:irc.iiens.net 352 pwet * ~a je.suis.t1r.net irc.iiens.net pwet H :0 d +*/ +static int parse_352(struct link_server *server, struct line *line) +{ + char *im; + int ret = OK_FORGET; + if (line->elemc < 4) + return ERR_PROTOCOL; + if (strcmp(line->elemv[1], server->nick) != 0) + return ret; + + im = malloc(strlen(server->nick) + strlen(line->elemv[3]) + + strlen(line->elemv[4]) + 2 + 1); + strcpy(im, server->nick); + strcat(im, "!"); + strcat(im, line->elemv[3]); + strcat(im, "@"); + strcat(im, line->elemv[4]); + set_ircmask(server, im); + free(im); + return ret; +} + +/* + * parses:join part mode kick kill privmsg quit nick names + * returns: -1 invalid protocol + */ +int irc_dispatch_server(struct link_server *server, struct line *line) +{ + int ret = OK_COPY; + + if (line->elemc == 0) + return ERR_PROTOCOL; + + if (!server->irc_mask && + strcmp(line->elemv[0], "352") == 0) /* WHO RPL */ + ret = parse_352(server, line); + + if (strcmp(line->elemv[0], "PING") == 0) { + if (line->elemc < 2) + return ERR_PROTOCOL; + struct line *resp = irc_line_new(); + char *resps; + irc_line_append(resp, "PONG"); + irc_line_append(resp, line->elemv[1]); + resps = irc_line_to_string(resp); + write_line_fast(CONN(server), resps); + irc_line_free(resp); + free(resps); + ret = OK_FORGET; + } else if (strcmp(line->elemv[0], "PONG") == 0) { + if (line->elemc == 3 && strcmp(line->elemv[2], S_PING) == 0) { + if (server->laginit_ts != -1) { + irc_compute_lag(server); + irc_lag_init(server); + } + ret = OK_FORGET; + } + } else if (strcmp(line->elemv[0], "433") == 0) { + if (LINK(server)->s_state != IRCS_CONNECTED) { + size_t nicklen = strlen(server->nick); + char *newnick = malloc(nicklen + 2); + strcpy(newnick, server->nick); + if (strlen(server->nick) < 9) + strcat(newnick, "`"); + else if (newnick[8] != '`') { + newnick[8] = '`'; + newnick[9] = 0; + } else { + newnick[8] = rand() * ('z' - 'a') / RAND_MAX + + 'a'; + newnick[9] = 0; + } + free(server->nick); + server->nick = newnick; + + WRITE_LINE1(CONN(server), NULL, "NICK", server->nick); + ret = OK_FORGET; + } + } else if (LINK(server)->s_state == IRCS_RECONNECTING) { + ret = OK_FORGET; + if (strcmp(line->elemv[0], "376") == 0) /* end of motd */ + irc_server_connected(server); + } else if (LINK(server)->s_state == IRCS_CONNECTING) { + ret = OK_FORGET; + if (strcmp(line->elemv[0], "NOTICE") == 0) { + } else if (strcmp(line->elemv[0], "376") == 0) { + irc_server_connected(server); + list_add_last(&LINK(server)->init_strings, + irc_line_dup(line)); + } else { + list_add_last(&LINK(server)->init_strings, + irc_line_dup(line)); + } + } else if (strcmp(line->elemv[0], "001") == 0) { + ret = irc_001(server, line); + if (LINK(server)->s_state == IRCS_CONNECTING) { + if (!list_is_empty(&LINK(server)->init_strings)) + return ERR_PROTOCOL; + list_add_last(&LINK(server)->init_strings, + irc_line_dup(line)); + } + } else if (strcmp(line->elemv[0], "JOIN") == 0) { + ret = irc_join(server, line); + } else if (strcmp(line->elemv[0], "332") == 0) { + ret = irc_332(server, line); + } else if (strcmp(line->elemv[0], "333") == 0) { + ret = irc_333(server, line); + } else if (strcmp(line->elemv[0], "353") == 0) { + ret = irc_353(server, line); + } else if (strcmp(line->elemv[0], "366") == 0) { + ret = irc_366(server, line); + } else if (strcmp(line->elemv[0], "PART") == 0) { + ret = irc_part(server, line); + } else if (strcmp(line->elemv[0], "MODE") == 0) { + ret = irc_mode(server, line); + } else if (strcmp(line->elemv[0], "TOPIC") == 0) { + ret = irc_topic(server, line); + } else if (strcmp(line->elemv[0], "KICK") == 0) { + ret = irc_kick(server, line); + } else if (strcmp(line->elemv[0], "PRIVMSG") == 0) { + ret = irc_privmsg(server, line); + } else if (strcmp(line->elemv[0], "NOTICE") == 0) { + ret = irc_notice(server, line); + } else if (strcmp(line->elemv[0], "QUIT") == 0) { + ret = irc_quit(server, line); + } else if (strcmp(line->elemv[0], "NICK") == 0) { + ret = irc_nick(server, line); + } + + if (ret == OK_COPY) { + int i; + for (i = 0; i < LINK(server)->l_clientc; i++) { + char *s = irc_line_to_string(line); + write_line(CONN(LINK(server)->l_clientv[i]), s); + free(s); + } + } + return ret; +} + +/* send join and related stuff to client */ +static void irc_send_join(struct link_client *ic, struct channel *chan) +{ + WRITE_LINE1(CONN(ic), LINK(ic)->l_server->irc_mask, "JOIN", chan->name); + if (chan->topic) + WRITE_LINE3(CONN(ic), P_SERV, "332", LINK(ic)->l_server->nick, + chan->name, chan->topic); + if (chan->creator && chan->create_ts) + WRITE_LINE4(CONN(ic), P_SERV, "333", LINK(ic)->l_server->nick, + chan->name, chan->creator, chan->create_ts); + + /* XXX: could be more efficient */ + if (!conf_no_backlog && log_has_backlog(LINK(ic)->log, chan->name)) { + char *line; + int raw; + while ((line = log_backread(LINK(ic)->log, chan->name, &raw))) { + mylog(LOG_DEBUG, "%s", line); + if (raw) + write_line(CONN(ic), line); + else + WRITE_LINE2(CONN(ic), P_IRCMASK, "PRIVMSG", + chan->name, line); + free(line); + } + WRITE_LINE2(CONN(ic), P_IRCMASK, "PRIVMSG", chan->name, + "End of backlog."); + } + + list_t *name_list = channel_name_list(chan); + char *s; + while ((s = list_remove_first(name_list))) { + char tmptype[2]; + tmptype[0] = chan->type; + tmptype[1] = 0; + WRITE_LINE4(CONN(ic), P_SERV, "353", LINK(ic)->l_server->nick, + tmptype, chan->name, s); + free(s); + } + list_free(name_list); + + WRITE_LINE3(CONN(ic), P_SERV, "366", LINK(ic)->l_server->nick, + chan->name, "End of /NAMES list."); + +} + +static void write_init_string(connection_t *c, struct line *line, char *nick) +{ + char *tmp; + char *l; + + tmp = line->elemv[1]; + line->elemv[1] = nick; + l = irc_line_to_string(line); + write_line(c, l); + free(l); + line->elemv[1] = tmp; +} + +static void bind_to_link(struct link *l, struct link_client *ic) +{ + int i = l->l_clientc; + + LINK(ic) = l; + l->l_clientc++; + l->l_clientv = realloc(l->l_clientv, l->l_clientc * + sizeof(struct link_client *)); + if (!l->l_clientv) + fatal("realloc"); + l->l_clientv[i] = ic; +} + +static void unbind_from_link(struct link_client *ic) +{ + struct link *l = LINK(ic); + int i; + for (i = 0; i < l->l_clientc; i++) + if (l->l_clientv[i] == ic) + break; + if (i == l->l_clientc) + fatal("unbind_from_link"); + for (i = i + 1; i < l->l_clientc; i++) + l->l_clientv[i - 1] = l->l_clientv[i]; + + l->l_clientc--; + l->l_clientv = realloc(l->l_clientv, l->l_clientc * + sizeof(struct link_client *)); + if (l->l_clientc == 0) { /* realloc was equiv to free() */ + l->l_clientv = NULL; + return; + } + if (!l->l_clientv) + fatal("realloc"); +} + +void adm_bip(struct link_client *ic, struct line *line); +int irc_cli_bip(struct link_client *ic, struct line *line) +{ + adm_bip(ic, line); + return OK_FORGET; +} + +static int irc_cli_startup(struct link_client *ic, struct line *line, + list_t *linkl) +{ + char *init_nick; + char *initmask; + + if (!ic->init_pass || !ic->init_nick || !ic->init_user + || !ic->init_real_name) + fatal("internal irc_cli_startup"); + + list_iterator_t it; + for (list_it_init(linkl, &it); list_it_item(&it); list_it_next(&it)) { + struct link *l = list_it_item(&it); + if (chash_cmp(ic->init_pass, l->password, l->seed) == 0 && + (strcmp(ic->init_user, l->login) == 0 || + strcmp(ic->init_real_name, l->login) == 0)) { + bind_to_link(l, ic); + break; + } + } + + free(ic->init_pass); + ic->init_pass = NULL; + init_nick = ic->init_nick; + ic->init_nick = NULL; + free(ic->init_user); + ic->init_user = NULL; + free(ic->init_real_name); + ic->init_real_name = NULL; + + if (!LINK(ic)) + return ERR_AUTH; + + if (LINK(ic)->s_state == IRCS_NONE) { + /* drop it if corresponding server hasn't connected at all. */ + write_line_fast(CONN(ic), ":irc.proxy.net NOTICE pouet " + ":ERROR Proxy not yet connected, try again " + "later\r\n"); + unbind_from_link(ic); + return OK_CLOSE; + } + +#if 0 + TODO code this + if (!connection_check_source(ic, ic->client->src_ipl)) + return ERR_AUTH; +#endif + + TYPE(ic) = IRC_TYPE_CLIENT; + + initmask = make_irc_mask(init_nick, LINK(ic)->l_server->irc_mask); + for (list_it_init(&LINK(ic)->init_strings, &it); + list_it_item(&it); list_it_next(&it)) + write_init_string(CONN(ic), list_it_item(&it), init_nick); + + /* we change nick on client */ + if (LINK(ic)->l_server) { + struct link_server *server = LINK(ic)->l_server; + WRITE_LINE1(CONN(ic), initmask, "NICK", server->nick); + + if (!LINK(ic)->ignore_first_nick) + WRITE_LINE1(CONN(server), NULL, "NICK", init_nick); + else if (LINK(ic)->away_nick && + strcmp(LINK(ic)->away_nick, server->nick) == 0) + WRITE_LINE1(CONN(server), NULL, "NICK", + LINK(server)->connect_nick); + } + + free(initmask); + if (!LINK(ic)->l_server) { + free(init_nick); + return OK_FORGET; + } + + + hash_iterator_t hi; + for (hash_it_init(&LINK(ic)->l_server->channels, &hi); + hash_it_item(&hi); hash_it_next(&hi)) { + irc_send_join(ic, (struct channel *)hash_it_item(&hi)); + } + + /* backlog privates */ + char *str; + int raw; + while ((str = log_backread(LINK(ic)->log, S_PRIVATES, &raw))) { + if (raw) + write_line(CONN(ic), str); + else + WRITE_LINE2(CONN(ic), P_IRCMASK, "PRIVMSG", + LINK(ic)->l_server->nick, str); + free(str); + } + + log_client_connected(LINK(ic)->log); + free(init_nick); + + return OK_FORGET; +} + +static int irc_cli_nick(struct link_client *ic, struct line *line, list_t *cl) +{ + if (line->elemc != 2) + return ERR_PROTOCOL; + + if ((ic->state & IRCC_READY) == IRCC_READY) + return OK_COPY; + + ic->state |= IRCC_NICK; + if (ic->init_nick) + free(ic->init_nick); + ic->init_nick = strdup(line->elemv[1]); + + if ((ic->state & IRCC_READY) == IRCC_READY) + return irc_cli_startup(ic, line, cl); + + if ((ic->state & IRCC_PASS) != IRCC_PASS) + WRITE_LINE2(CONN(ic), P_SERV, "NOTICE", ic->init_nick, + "You should type /QUOTE PASS your_password"); + + return OK_FORGET; +} + +static int irc_cli_user(struct link_client *ic, struct line *line, list_t *cl) +{ + if (line->elemc != 5) + return ERR_PROTOCOL; + + if ((ic->state & IRCC_READY) == IRCC_READY) + return ERR_PROTOCOL; + + ic->state |= IRCC_USER; + if (ic->init_user) + free(ic->init_user); + ic->init_user = strdup(line->elemv[1]); + if (ic->init_real_name) + free(ic->init_real_name); + ic->init_real_name = strdup(line->elemv[4]); + if ((ic->state & IRCC_READY) == IRCC_READY) + return irc_cli_startup(ic, line, cl); + return OK_FORGET; +} + +static int irc_cli_pass(struct link_client *ic, struct line *line, list_t *cl) +{ + if (line->elemc != 2) + return ERR_PROTOCOL; + + if ((ic->state & IRCC_READY) == IRCC_READY) + return ERR_PROTOCOL; + + ic->state |= IRCC_PASS; + if (ic->init_pass) + free(ic->init_pass); + ic->init_pass = strdup(line->elemv[1]); + if ((ic->state & IRCC_READY) == IRCC_READY) + return irc_cli_startup(ic, line, cl); + return OK_FORGET; +} + +static int irc_cli_quit(struct link_client *ic, struct line *line) +{ + return OK_CLOSE; +} + +static int irc_cli_privmsg(struct link_client *ic, struct line *line) +{ + log_privmsg(LINK(ic)->log, LINK(ic)->l_server->nick, + line->elemv[1], line->elemv[2]); + return OK_COPY_CLI; +} + +static int irc_cli_notice(struct link_client *ic, struct line *line) +{ + log_notice(LINK(ic)->log, LINK(ic)->l_server->nick, + line->elemv[1], line->elemv[2]); + return OK_COPY_CLI; +} + +#if 0 +static void unbind_to_server(struct link_client *ic) +{ + struct irc_server *s = ic->client->server; + int i; + for (i = 0; i < s->clientc; i++) + if (s->clientv[i] == ic) + break; + if (i == s->clientc) + fatal("unbind_to_server"); + for (i = i + 1; i < s->clientc; i++) + s->clientv[i - 1] = s->clientv[i]; + + s->clientc--; + s->clientv = realloc(s->clientv, s->clientc * + sizeof(struct irc_client *)); + if (s->clientc == 0) { /* realloc was equiv to free() */ + s->clientv = NULL; + return; + } + if (!s->clientv) + fatal("realloc"); +} + +static void bind_to_server(struct irc_client *ic) +{ + struct irc_server *s = ic->client->server; + int i = s->clientc; + s->clientc++; + s->clientv = realloc(s->clientv, s->clientc * + sizeof(struct irc_client *)); + if (!s->clientv) + fatal("realloc"); + s->clientv[i] = ic; +} +#endif + +static void irc_notify_disconnection(struct link_server *is) +{ + int i; + for (i = 0; i < LINK(is)->l_clientc; i++) { + struct link_client *ic = LINK(is)->l_clientv[i]; + hash_iterator_t hi; + for (hash_it_init(&is->channels, &hi); hash_it_item(&hi); + hash_it_next(&hi)) { + struct channel *c = (struct channel *)hash_it_item(&hi); + WRITE_LINE2(CONN(ic), is->irc_mask, "PART", + c->name, "Server disconnected, " + "reconnecting"); + } + WRITE_LINE2(CONN(ic), P_IRCMASK, "PRIVMSG", is->irc_mask, + "Server disconnected, reconnecting"); + } +} + +void irc_add_channel_info(struct link_server *ircs, char *chan, char *key) +{ + struct chan_info *ci; + if (!ischannel(*chan)) + return; + + ci = hash_get(&LINK(ircs)->chan_infos, chan); + if (!ci) { + struct chan_info *ci; + ci = malloc(sizeof(struct chan_info)); + ci->name = strdup(chan); + ci->key = key ? strdup(key) : NULL; + hash_insert(&LINK(ircs)->chan_infos, chan, ci); + } else { + if (ci->key) { + free(ci->key); + ci->key = NULL; + } + ci->key = key ? strdup(key) : NULL; + } +} + +static int irc_cli_join(struct link_client *irc, struct line *line) +{ + if (line->elemc != 2 && line->elemc != 3) + return ERR_PROTOCOL; + + char *s, *e, *ks, *ke; + s = line->elemv[1]; + if (line->elemc == 3) + ks = line->elemv[2]; + else + ks = NULL; + + while ((e = strchr(s, ','))) { + size_t len = e - s; + char *p = malloc(len + 1); + size_t klen; + char *kp = NULL; + + memcpy(p, s, len); + p[len] = 0; + if (ks) { + if (strlen(ks)) { + ke = strchr(ks, ','); + if (!ke) + ke = ks + strlen(ks); + klen = ke - ks; + kp = malloc(klen + 1); + memcpy(kp, ks, klen); + kp[klen] = 0; + if (*ke == 0) + ks = NULL; + } else + kp = ks = NULL; + } + + irc_add_channel_info(LINK(irc)->l_server, p, kp); + free(p); + if (kp) { + free(kp); + if (ks) + ks = ke + 1; + } + s = e + 1; + } + + irc_add_channel_info(LINK(irc)->l_server, s, ks); + return OK_COPY; +} + +static int irc_cli_part(struct link_client *irc, struct line *line) +{ + if (line->elemc != 2 && line->elemc != 3) + return ERR_PROTOCOL; + + struct chan_info *ci; + if ((ci = hash_remove_if_exists(&LINK(irc)->chan_infos, + line->elemv[1])) != NULL) { + free(ci->name); + if (ci->key) + free(ci->key); + free(ci); + } + return OK_COPY; +} + +int irc_cli_bip(struct link_client *ic, struct line *line); +static int irc_dispatch_client(struct link_client *ic, struct line *line) +{ + int r = OK_COPY; + if (line->elemc == 0) + return ERR_PROTOCOL; + + if (strcmp(line->elemv[0], "PING") == 0) { + if (line->elemc < 2) + return ERR_PROTOCOL; + WRITE_LINE1(CONN(ic), LINK(ic)->name, "PONG", line->elemv[1]); + r = OK_FORGET; + } else if (strcasecmp(line->elemv[0], "BIP") == 0) { + r = irc_cli_bip(ic, line); + } else if (strcmp(line->elemv[0], "JOIN") == 0) { + r = irc_cli_join(ic, line); + } else if (strcmp(line->elemv[0], "PART") == 0) { + r = irc_cli_part(ic, line); + } else if (strcmp(line->elemv[0], "NICK") == 0) { + r = irc_cli_nick(ic, line, NULL); + } else if (strcmp(line->elemv[0], "QUIT") == 0) { + r = irc_cli_quit(ic, line); + } else if (strcmp(line->elemv[0], "PRIVMSG") == 0) { + r = irc_cli_privmsg(ic, line); + } else if (strcmp(line->elemv[0], "NOTICE") == 0) { + r = irc_cli_notice(ic, line); + } + + if (r == OK_COPY || r == OK_COPY_CLI) { + char *str = irc_line_to_string(line); + if (LINK(ic)->s_state == IRCS_CONNECTED && + LINK(ic)->l_server->irc_mask) + write_line(CONN(LINK(ic)->l_server), str); + else if (LINK(ic)->l_server->irc_mask) + WRITE_LINE2(CONN(ic), P_IRCMASK, "PRIVMSG", + LINK(ic)->l_server->irc_mask, + ":Not connected please try again " + "later...\r\n"); + + free(str); + if (r != OK_COPY) { + int i; + struct link_server *s = LINK(ic)->l_server; + for (i = 0; i < LINK(s)->l_clientc; i++) { + if (LINK(s)->l_clientv[i] != ic) { + line->origin = s->irc_mask; + str = irc_line_to_string(line); + write_line(CONN(LINK(s)->l_clientv[i]), + str); + free(str); + line->origin = NULL; + } + } + } + } + return r; +} + +static int irc_dispatch_loging_client(struct link_client *ic, struct line *line, + list_t *linkl) +{ + if (line->elemc == 0) + return ERR_PROTOCOL; + + if (strcmp(line->elemv[0], "NICK") == 0) { + return irc_cli_nick(ic, line, linkl); + } else if (strcmp(line->elemv[0], "USER") == 0) { + return irc_cli_user(ic, line, linkl); + } else if (strcmp(line->elemv[0], "PASS") == 0) { + return irc_cli_pass(ic, line, linkl); + } + return OK_FORGET; +} + +int irc_dispatch(struct link_any *l, struct line *line, list_t *linkl) +{ + switch (TYPE(l)) { + case IRC_TYPE_SERVER: + return irc_dispatch_server((struct link_server*)l, line); + break; + case IRC_TYPE_CLIENT: + return irc_dispatch_client((struct link_client*)l, line); + break; + case IRC_TYPE_LOGING_CLIENT: + return irc_dispatch_loging_client((struct link_client*)l, + line, linkl); + break; + default: + fatal("gnéééééé"); + } + return ERR_PROTOCOL; /* never reached */ +} + +static int origin_is_me(struct line *l, struct link_server *server) +{ + if (!l->origin) + return 0; + char *nick = nick_from_ircmask(l->origin); + if (strcmp(nick, server->nick) == 0) { + free(nick); + return 1; + } + free(nick); + return 0; +} + +static int irc_join(struct link_server *server, struct line *line) +{ + char *s_nick; + char *s_chan; + struct channel *channel; + struct nick *nick; + + if (line->elemc != 2 && line->elemc != 3) + return ERR_PROTOCOL; + + s_chan = line->elemv[1]; + log_join(LINK(server)->log, line->origin, s_chan); + + channel = hash_get(&server->channels, s_chan); + if (origin_is_me(line, server)) { + if (!channel) { + channel = channel_new(s_chan); + hash_insert(&server->channels, s_chan, channel); + } + return OK_COPY; + } + /* if we're not on channel and !origin_is_me, we should not get any + * JOIN */ + if (!channel) + return ERR_PROTOCOL; + + s_nick = nick_from_ircmask(line->origin); + + nick = calloc(sizeof(struct nick), 1); + if (!nick) + fatal("calloc"); + nick->name = s_nick; /* not freeing s_nick */ + hash_insert(&channel->nicks, s_nick, nick); + return OK_COPY; +} + +static int irc_332(struct link_server *server, struct line *line) +{ + struct channel *channel; + if (line->elemc != 4) + return ERR_PROTOCOL; + + channel = hash_get(&server->channels, line->elemv[2]); + /* we can get topic reply for chans we're not on */ + if (!channel) + return OK_COPY; + + if (channel->topic) + free(channel->topic); + channel->topic = strdup(line->elemv[3]); + + log_init_topic(LINK(server)->log, channel->name, channel->topic); + return OK_COPY; +} + +static int irc_333(struct link_server *server, struct line *line) +{ + struct channel *channel; + if (line->elemc != 5) + return ERR_PROTOCOL; + + channel = hash_get(&server->channels, line->elemv[2]); + /* we can get topic info reply for chans we're not on */ + if (!channel) + return OK_COPY; + if (channel->creator) + free(channel->creator); + channel->creator = strdup(line->elemv[3]); + if (channel->create_ts) + free(channel->create_ts); + channel->create_ts = strdup(line->elemv[4]); + log_init_topic_time(LINK(server)->log, channel->name, channel->creator, + channel->create_ts); + return OK_COPY; +} + +static void nick_free(struct nick *nick) +{ + if (nick->name) + free(nick->name); + free(nick); +} + +static int irc_353(struct link_server *server, struct line *line) +{ + struct channel *channel; + struct nick *nick; + char *names, *eon; + size_t len; + char *tmp; + + if (line->elemc != 5) + return ERR_PROTOCOL; + + channel = hash_get(&server->channels, line->elemv[3]); + /* we can get names reply for chans we're not on */ + if (!channel) + return OK_COPY; + + if (!channel->running_names) { + channel->running_names = 1; + hash_iterator_t hi; + for (hash_it_init(&channel->nicks, &hi); hash_it_item(&hi); + hash_it_next(&hi)) { + nick_free(hash_it_item(&hi)); + } + hash_clean(&channel->nicks); + } + + /* TODO check that type is one of "=" / "*" / "@" */ + channel->type = line->elemv[2][0]; + + names = line->elemv[4]; + + while (*names) { + eon = names; + int ovmask = 0; + /* these should be exclusive */ + if (*names == '@') { + names++; + ovmask |= NICKOP; + } else if (*names == '+') { + names++; + ovmask |= NICKVOICED; + } + eon = names; + while (*eon && *eon != ' ') + eon++; + + len = eon - names; + tmp = malloc(len + 1); + if (!tmp) + fatal("malloc"); + memcpy(tmp, names, len); + tmp[len] = 0; + + nick = malloc(sizeof(struct nick)); + if (!nick) + fatal("malloc"); + nick->name = tmp; + nick->ovmask = ovmask; + + hash_insert(&channel->nicks, nick->name, nick); + while (*eon && *eon == ' ') + eon++; + names = eon; + } + return OK_COPY; +} + +static int irc_366(struct link_server *server, struct line *line) +{ + struct channel *channel; + + if (line->elemc != 4) + return ERR_PROTOCOL; + + channel = hash_get(&server->channels, line->elemv[2]); + if (channel && channel->running_names) + channel->running_names = 0; + return OK_COPY; +} + +static void channel_free(struct channel *c) +{ + if (c->name) + free(c->name); + if (c->mode) + free(c->mode); + if (c->key) + free(c->key); + if (c->topic) + free(c->topic); + if (c->creator) + free(c->creator); + if (c->create_ts) + free(c->create_ts); + +/* + char *l; + while ((l = (char *)list_remove_first(&c->bans))) + free(l); +*/ + hash_iterator_t hi; + for (hash_it_init(&c->nicks, &hi); hash_it_item(&hi); hash_it_next(&hi)) + nick_free(hash_it_item(&hi)); + hash_clean(&c->nicks); + free(c); +} + +static int irc_part(struct link_server *server, struct line *line) +{ + char *s_nick; + char *s_chan; + struct channel *channel; + struct nick *nick; + + if (line->elemc != 2 && line->elemc != 3) + return ERR_PROTOCOL; + + s_chan = line->elemv[1]; + + channel = hash_get(&server->channels, s_chan); + /* we can't get part message for chans we're not on */ + if (!channel) + return ERR_PROTOCOL; + + if (origin_is_me(line, server)) { + log_part(LINK(server)->log, line->origin, s_chan, + line->elemc == 3 ? line->elemv[2] : NULL); + + hash_remove(&server->channels, s_chan); + channel_free(channel); + return OK_COPY; + } + + s_nick = nick_from_ircmask(line->origin); + nick = hash_get(&channel->nicks, s_nick); + if (!nick) { + free(s_nick); + return ERR_PROTOCOL; + } + nick = hash_remove(&channel->nicks, s_nick); + free(s_nick); + + log_part(LINK(server)->log, line->origin, s_chan, + line->elemc == 3 ? line->elemv[2]:NULL); + + nick_free(nick); + return OK_COPY; +} + +static void mode_add_letter_uniq(struct link_server *s, char c) +{ + int i; + for (i = 0; i < s->user_mode_len; i++) { + if (s->user_mode[i] == c) + return; + } + s->user_mode = realloc(s->user_mode, s->user_mode_len + 1); + s->user_mode[s->user_mode_len++] = c; +} + +static void mode_remove_letter(struct link_server *s, char c) +{ + int i; + for (i = 0; i < s->user_mode_len; i++) { + if (s->user_mode[i] == c) { + for (; i < s->user_mode_len - 1; i++) + s->user_mode[i] = s->user_mode[i + 1]; + s->user_mode_len--; + s->user_mode = realloc(s->user_mode, s->user_mode_len); + return; + } + } +} + +static void irc_user_mode(struct link_server *server, struct line *line) +{ + char *mode; + int add = 1; + for (mode = line->elemv[2]; *mode; mode++) { + if (*mode == '-') + add = 0; + else if (*mode == '+') + add = 1; + else { + if (add) { + mode_add_letter_uniq(server, *mode); + } else { + mode_remove_letter(server, *mode); + } + } + } +} + +static int irc_mode(struct link_server *server, struct line *line) +{ + struct channel *channel; + char *mode; + int add = 1; + unsigned cur_arg = 0; + struct nick *nick; + + if (line->elemc < 3) + return ERR_PROTOCOL; + + if (ischannel(line->elemv[1][0])) { + channel = hash_get(&server->channels, line->elemv[1]); + /* we can't get mode message for chans we're not on */ + if (!channel) + return ERR_PROTOCOL; + log_mode(LINK(server)->log, line->origin, line->elemv[1], + line->elemv[2], line->elemv + 3, + line->elemc - 3); + } else if (strcmp(line->elemv[1], server->nick) == 0) { + log_mode(LINK(server)->log, line->origin, line->elemv[1], + line->elemv[2], line->elemv + 3, + line->elemc - 3); + irc_user_mode(server, line); + return OK_COPY; + } + + /* + * MODE -a+b.. #channel args + * ^ ^ + * mode cur_arg + */ + for (mode = line->elemv[2]; *mode; mode++) { + switch (*mode) { + case '-': + add = 0; + break; + case '+': + add = 1; + break; + case 'b': + if (cur_arg + 3 >= line->elemc) + return ERR_PROTOCOL; + cur_arg++; + break; + case 'o': + + if (cur_arg + 3 >= line->elemc) + return ERR_PROTOCOL; + + nick = hash_get(&channel->nicks, + line->elemv[cur_arg + 3]); + if (!nick) + return ERR_PROTOCOL; + if (add) + nick->ovmask |= NICKOP; + else + nick->ovmask &= ~NICKOP; + cur_arg++; + break; + case 'v': + if (cur_arg + 3 >= line->elemc) + return ERR_PROTOCOL; + + nick = hash_get(&channel->nicks, + line->elemv[cur_arg + 3]); + if (!nick) + return ERR_PROTOCOL; + if (add) + nick->ovmask |= NICKVOICED; + else + nick->ovmask &= ~NICKVOICED; + cur_arg++; + break; + case 'k': + if (add) { + if (cur_arg + 3 >= line->elemc) + return ERR_PROTOCOL; + + channel->key = strdup(line->elemv[cur_arg + 3]); + cur_arg++; + } else { + if (channel->key) { + free(channel->key); + channel->key = NULL; + } + } + break; + case 'l': + if (add) { + cur_arg++; + } + break; + case 'h': + case 'H': + if (cur_arg + 3 >= line->elemc) + return ERR_PROTOCOL; + cur_arg++; + break; + default: + break; + } + } + return OK_COPY; +} + +static char *irc_timestamp(void) +{ + char *ts = malloc(21); + snprintf(ts, 20, "%ld", (long int)time(NULL)); + return ts; +} + +static int irc_topic(struct link_server *server, struct line *line) +{ + struct channel *channel; + char *topic; + + if (line->elemc != 3) + return ERR_PROTOCOL; + + channel = hash_get(&server->channels, line->elemv[1]); + /* we can't get topic message for chans we're not on */ + if (!channel) + return ERR_PROTOCOL; + + if (channel->topic) + free(channel->topic); + topic = line->elemv[2]; + if (*topic == ':') + topic++; + channel->topic = strdup(topic); + + /* + * :arion.oftc.net 333 bip`luser #bipqSDFQE3 + * nohar!~nohar@borne28.noc.nerim.net 1107338095 + */ + + if (channel->creator) + free(channel->creator); + channel->creator = strmaydup(line->origin); + if (channel->create_ts) + free(channel->create_ts); + channel->create_ts = irc_timestamp(); + + log_topic(LINK(server)->log, line->origin, line->elemv[1], topic); + return OK_COPY; +} + +static int irc_kick(struct link_server *server, struct line *line) +{ + struct channel *channel; + struct nick *nick; + + if (line->elemc != 3 && line->elemc != 4) + return ERR_PROTOCOL; + + channel = hash_get(&server->channels, line->elemv[1]); + /* we can't get kick message for chans we're not on */ + if (!channel) + return ERR_PROTOCOL; + + nick = hash_get(&channel->nicks, line->elemv[2]); + if (!nick) + return ERR_PROTOCOL; + + if (strcmp(nick->name, server->nick) == 0) { + log_kick(LINK(server)->log, line->origin, channel->name, + nick->name, + line->elemc == 4 ? line->elemv[3] : NULL); + + hash_remove(&server->channels, channel->name); + channel_free(channel); + return OK_COPY; + } + + hash_remove(&channel->nicks, nick->name); + nick_free(nick); + log_kick(LINK(server)->log, line->origin, line->elemv[1], + line->elemv[2], + line->elemc == 4 ? line->elemv[3] : NULL); + return OK_COPY; +} + +static int irc_privmsg(struct link_server *server, struct line *line) +{ + log_privmsg(LINK(server)->log, line->origin, line->elemv[1], + line->elemv[2]); + return OK_COPY; +} + +static int irc_notice(struct link_server *server, struct line *line) +{ + log_notice(LINK(server)->log, line->origin, line->elemv[1], + line->elemv[2]); + return OK_COPY; +} + +static int irc_quit(struct link_server *server, struct line *line) +{ + return irc_generic_quit(server, line); +} + +static int irc_nick(struct link_server *server, struct line *line) +{ + struct channel *channel; + struct nick *nick; + hash_iterator_t hi; + char *s_nick; + + if (line->elemc != 2) + return ERR_PROTOCOL; + + s_nick = nick_from_ircmask(line->origin); + + if (strcmp(s_nick, server->nick) == 0) { + char *nim; + free(server->nick); + server->nick = strdup(line->elemv[1]); + + /* How the hell do we handle that crap cleanly ? */ + nim = make_irc_mask(line->elemv[1], server->irc_mask); + if (nim) { + free(server->irc_mask); + server->irc_mask = nim; + } + if (LINK(server)->follow_nick && + (LINK(server)->away_nick == NULL || + strcmp(server->nick, LINK(server)->away_nick)) + != 0) { + free(LINK(server)->connect_nick); + LINK(server)->connect_nick = strdup(server->nick); + } + } + + for (hash_it_init(&server->channels, &hi); hash_it_item(&hi); + hash_it_next(&hi)) { + channel = hash_it_item(&hi); + nick = hash_get(&channel->nicks, s_nick); + if (!nick) + continue; + hash_remove(&channel->nicks, s_nick); + free(nick->name); + nick->name = strdup(line->elemv[1]); + hash_insert(&channel->nicks, nick->name, nick); + log_nick(LINK(server)->log, s_nick, channel->name, + line->elemv[1]); + } + + free(s_nick); + return OK_COPY; +} + +static int irc_generic_quit(struct link_server *server, struct line *line) +{ + struct channel *channel; + struct nick *nick; + hash_iterator_t hi; + char *s_nick; + + if (line->elemc != 2 && line->elemc != 1) + return ERR_PROTOCOL; + + s_nick = nick_from_ircmask(line->origin); + for (hash_it_init(&server->channels, &hi); hash_it_item(&hi); + hash_it_next(&hi)) { + channel = hash_it_item(&hi); + nick = hash_get(&channel->nicks, s_nick); + if (!nick) + continue; + hash_remove(&channel->nicks, s_nick); + nick_free(nick); + + log_quit(LINK(server)->log, s_nick, channel->name, + line->elemc == 2 ? line->elemv[1] : NULL); + } + free(s_nick); + return OK_COPY; +} + +static void irc_server_startup(struct link_server *ircs) +{ + char *nick; + + if (LINK(ircs)->s_password) + WRITE_LINE1(CONN(ircs), NULL, "PASS", LINK(ircs)->s_password); + + WRITE_LINE4(CONN(ircs), NULL, "USER", LINK(ircs)->user, "0", "*", + LINK(ircs)->real_name); + + nick = ircs->nick; + if (LINK(ircs)->away_nick && LINK(ircs)->l_clientc == 0) { + if (nick) + free(nick); + nick = strdup(LINK(ircs)->away_nick); + } + if (!LINK(ircs)->follow_nick || nick == NULL) { + if (nick) + free(nick); + nick = strdup(LINK(ircs)->connect_nick); + } + + ircs->nick = nick; + WRITE_LINE1(CONN(ircs), NULL, "NICK", ircs->nick); +} + +static void server_next(struct link *l) +{ + l->cur_server++; + if (l->cur_server >= l->serverc) + l->cur_server -= l->serverc; +} + +static struct link_client *irc_accept_new(connection_t *conn) +{ + struct link_client *ircc; + connection_t *newconn; + + newconn = accept_new(conn); + if (!newconn) + return NULL; + + ircc = calloc(sizeof(struct link_client), 1); + CONN(ircc) = newconn; + TYPE(ircc) = IRC_TYPE_LOGING_CLIENT; + CONN(ircc)->user_data = ircc; + return ircc; +} + +void server_cleanup(struct link_server *server) +{ + if (server->nick) { + free(server->nick); + server->nick = NULL; + } + if (server->irc_mask) { + free(server->irc_mask); + server->irc_mask = NULL; + } + if (LINK(server)->s_state == IRCS_CONNECTED) { + LINK(server)->s_state = IRCS_WAS_CONNECTED; + } else { + struct line *s; + LINK(server)->s_state = IRCS_NONE; + while ((s = list_remove_first(&LINK(server)->init_strings))) + irc_line_free(s); + } + + hash_iterator_t hi; + for (hash_it_init(&server->channels, &hi); hash_it_item(&hi); + hash_it_next(&hi)) + channel_free(hash_it_item(&hi)); + hash_init(&server->channels, HASH_NOCASE); + + if (CONN(server)) { + connection_free(CONN(server)); + CONN(server) = NULL; + } + irc_lag_init(server); +} + +void irc_client_close(struct link_client *ic) +{ + if (TYPE(ic) == IRC_TYPE_CLIENT) { + struct link_server *is = LINK(ic)->l_server; + log_client_disconnected(LINK(ic)->log); + unbind_from_link(ic); + if (LINK(ic)->l_clientc == 0) { + if (LINK(ic)->away_nick) + WRITE_LINE1(CONN(is), NULL, "NICK", + LINK(ic)->away_nick); + log_client_none_connected(LINK(ic)->log); + } + irc_client_free(ic); + } else if (TYPE(ic) == IRC_TYPE_LOGING_CLIENT) { + irc_client_free(ic); + } +} + +static void irc_close(struct link_any *l) +{ + if (CONN(l)) { + connection_free(CONN(l)); + CONN(l) = NULL; + } + if (TYPE(l) == IRC_TYPE_SERVER) { + /* TODO: free link_server as a whole */ + int timer = 0; + struct link_server *is = (struct link_server *)l; + + if (LINK(is)->s_state == IRCS_CONNECTED) + irc_notify_disconnection(is); + irc_server_shutdown(is); + log_disconnected(LINK(is)->log); + + server_next(LINK(is)); + server_cleanup(is); + if (LINK(is)->last_reconnection && + time(NULL) - LINK(is)->last_reconnection + < CONN_INTERVAL) + timer = RECONN_TIMER; + mylog(LOG_ERROR, "%s dead, reconnecting in %d seconds", + LINK(l)->name, timer); + LINK(is)->recon_timer = timer; + LINK(is)->l_server = NULL; + + irc_server_free((struct link_server *)is); + } else { + irc_client_close((struct link_client *)l); + } +} + +/* +#ifdef DEBUG +void debug_hell(void *ptr, list_t *a, list_t *b, list_t *c, list_t *d, + list_t *e, list_t *f, list_t *g, list_t *h) +{ + connection_t *cn; + + cn = (connection_t *)ptr; + printf ("Freed connection details :\n"); + printf ("ssl: %d, fd: %d, connstate: %d, listen: %d\n", cn->ssl, + cn->handle, cn->connected, cn->listening); + printf ("SSL: %x, X509: %x\n", cn->ssl_h, cn->cert); +#endif + + if ( ((struct irc*)cn->user_data)->type == IRC_TYPE_CLIENT) { + struct irc_client *c = (struct irc_client *)cn->user_data; + printf("Client nick %s, user %s, real %s, state %d\n", + c->init_nick, c->init_user, c->init_real_name, + c->state); + } else if ( ((struct irc*)cn->user_data)->type == IRC_TYPE_SERVER) { + struct irc_server *s = (struct irc_server *)cn->user_data; + printf("Server, name %s, serverc %d, nick %s, user %s\n", + s->name, s->serverc, s->nick, s->user); + printf("real %s, ssl %d, state %d, rtimer %d, mask %s\n", + s->real_name, s->state, s->ssl, s->recon_timer, s->irc_mask); + printf("cli_mask %s, user_mode %s, lag %d, last_recon %lu\n", + s->cli_mask, s->user_mode, s->lag, s->last_reconnection); + } else { + printf("Not an irc client nor server\n"); + } + if (list_get(c, cn)) { + printf ("%x est dans la liste des connexions\n", cn); + } + if (list_get(d, cn)) { + printf ("%x est dans la liste en cours de connexion\n", cn); + } + if (list_get(e, cn)) { + printf ("%x est dans la liste des connectés\n", cn); + } + if (list_get(f, cn)) { + printf ("%x est dans koc\n", cn); + } +} + +void debug_print_list_dummy(char *c, list_t *l) +{ + printf("%s", c); + list_iterator_t li; + for (list_it_init(l, &li); list_it_item(&li); list_it_next(&li)) { + printf("%x ", list_it_item(&li)); + } + printf("\n"); +} +*/ +/* for link init +struct link_server *irc_server_new() +{ + struct link_server *s; + struct passwd *pwusr; + + s = calloc(sizeof(struct link_server), 1); + if (!s) + fatal("calloc"); + + TYPE(s) = IRC_TYPE_SERVER; + s->state = IRCS_NONE; + hash_init(&s->channels, HASH_NOCASE); + hash_init(&s->chan_infos, HASH_NOCASE); + list_init(&s->chan_infos_join, list_ptr_cmp); + list_init(&s->init_strings, NULL); + s->recon_timer = 0; + s->lag = 0; + s->on_connect_send = NULL; + s->connect_nick = NULL; + s->vhost = NULL; + s->bind_port = 0; + irc_lag_init(s); + s->follow_nick = 1; + s->ignore_first_nick = 1; + return s; +} +*/ + +struct link_server *irc_server_new(struct link *link, connection_t *conn) +{ + struct link_server *s; + + s = calloc(sizeof(struct link_server), 1); + if (!s) + fatal("calloc"); + + TYPE(s) = IRC_TYPE_SERVER; + hash_init(&s->channels, HASH_NOCASE); + + link->l_server = s; + LINK(s) = link; + CONN(s) = conn; + + irc_lag_init(s); + return s; +} + +void irc_server_free(struct link_server *s) +{ + if (s->nick) + free(s->nick); + if (s->irc_mask) + free(s->irc_mask); + if (s->user_mode) + free(s->user_mode); + free(s); +} + +connection_t *irc_server_connect(struct link *link) +{ + struct link_server *ls; + connection_t *conn; + + conn = connection_new(link->serverv[link->cur_server]->host, + link->serverv[link->cur_server]->port, + link->vhost, link->bind_port, + link->s_ssl, CONNECT_TIMEOUT); + if (!conn) + fatal("connection_new"); + + ls = irc_server_new(link, conn); + + conn->user_data = ls; + irc_server_startup(ls); + return conn; +} + +int irc_server_lag_compute(struct link *l) +{ + struct link_server *server = l->l_server; + + if (LINK(server)->s_state == IRCS_CONNECTED) { + if (server->laginit_ts != -1) { + irc_compute_lag(server); + if (!irc_lags_out(server)) + return 0; + return 1; + } else { + server->lagtest_timeout--; + if (server->lagtest_timeout == 0) + irc_start_lagtest(server); + } + } + return 0; +} + +void irc_server_shutdown(struct link_server *s) +{ + if (!s->nick) + return; + if (LINK(s)->prev_nick) + free(LINK(s)->prev_nick); + LINK(s)->prev_nick = strdup(s->nick); +} + + +struct link_client *reloading_client; +/* + * The main loop + * inc is the incoming connection, clientl list a list of client struct that + * represent the accepcted credentials + */ +void irc_main(connection_t *inc, list_t *ll) +{ + list_t reconnectl; + list_t timerwaitl; + list_t connl; + list_t connecting_c; + list_t connected_c; + int timeleft = 1000; + int logflush_timer = conf_log_sync_interval; + + list_init(&reconnectl, NULL); + list_init(&timerwaitl, NULL); + list_init(&connl, list_ptr_cmp); + list_init(&connecting_c, list_ptr_cmp); + list_init(&connected_c, list_ptr_cmp); + + /* XXX: This one MUST be first */ + list_add_first(&connl, inc); + + /* + * Merge with already connected data, happens on SIGHUP + */ + list_iterator_t it; + for (list_it_init(ll, &it); list_it_item(&it); list_it_next(&it)) { + struct link *link = list_it_item(&it); + if (link->l_server) + list_add_last(&connl, CONN(link->l_server)); + else + list_add_last(&reconnectl, link); + if (link->l_clientc) { + int i; + for (i = 0; i < link->l_clientc; i++) + list_add_last(&connl, CONN(link->l_clientv[i])); + } + } + if (conf_error && reloading_client) { + char *nick; + if (LINK(reloading_client)->l_server) + nick = LINK(reloading_client)->l_server->nick; + else + nick = LINK(reloading_client)->prev_nick; + WRITE_LINE2(CONN(reloading_client), P_IRCMASK, "PRIVMSG", nick, + conf_errstr); + reloading_client = NULL; + } + + + while (!sighup) { + struct link *link; + connection_t *conn; + + /* Lauch reconnections */ + while ((link = list_remove_first(&reconnectl))) { + conn = irc_server_connect(link); + list_add_last(&connl, conn); + } + + /* Compute timeouts for next reconnections and lagouts */ + if (timeleft == 0) { + timeleft = 1000; + + /* log flushs */ + if (logflush_timer-- <= 0) { + logflush_timer = conf_log_sync_interval; + log_flush_all(); + } + + /* reconnects */ + list_iterator_t li; + for (list_it_init(&timerwaitl, &li); list_it_item(&li); + list_it_next(&li)) { + struct link *l = list_it_item(&li); + if (l->recon_timer <= 0) { + list_it_remove(&li); + list_add_last(&reconnectl, l); + l->last_reconnection = time(NULL); + } else { + l->recon_timer--; + } + } + + /* server lags */ + for (list_it_init(ll, &li); list_it_item(&li); + list_it_next(&li)) { + struct link *l = list_it_item(&li); + if(l->l_server && irc_server_lag_compute(l)) { + log_ping_timeout(l->log); + list_remove(&connl, CONN(l->l_server)); + irc_close((struct link_any *) + l->l_server); + list_add_last(&timerwaitl, l); + } + } + + /* drop lagging connecting client */ + for (list_it_init(&connecting_c, &li); + list_it_item(&li); list_it_next(&li)) { + struct link_client *ic = list_it_item(&li); + ic->logging_timer++; + if (ic->logging_timer > LOGGING_TIMEOUT) { + list_remove(&connl, CONN(ic)); + irc_close((struct link_any *)ic); + list_it_remove(&li); + } + } + } + + /* Da main loop */ + list_t *ready = wait_event(&connl, &timeleft); + while ((conn = list_remove_first(ready))) { + struct link_any *lc = + (struct link_any *)conn->user_data; + + if (conn == inc) { + struct link_client *n = irc_accept_new(conn); + if (!n) + fatal("Problem while binding local" + " socket"); + list_add_last(&connl, CONN(n)); + list_add_last(&connecting_c, n); + continue; + } + + /* reached only if socket is not listening */ + int err; + list_t *linel = read_lines(conn, &err); + if (err) { + if (TYPE(lc) == IRC_TYPE_SERVER) { + mylog(LOG_ERROR, "read_lines error, " + "closing %s ...", + LINK(lc)->name); + irc_server_shutdown(LINK(lc)->l_server); + } else { + mylog(LOG_ERROR, "read_lines error, " + "closing..."); + } + goto prot_err; + } + if (!linel) + continue; + + char *line_s; + while ((line_s = list_remove_first(linel))) { + struct line *line; + mylog(LOG_DEBUG, "\"%s\"", line_s); + if (*line_s == 0) { /* irssi does that.*/ + free(line_s); + continue; + } + + line = irc_line(line_s); + if (!line) { + mylog(LOG_ERROR, "Error in protocol, " + "closing..."); + free(line_s); + goto prot_err_lines; + } + int r; + int oldtype = TYPE(lc); + r = irc_dispatch((struct link_any*) + conn->user_data, line, ll); + irc_line_free(line); + free(line_s); + if (r == ERR_PROTOCOL) { + mylog(LOG_ERROR, "Error in protocol, " + "closing..."); + goto prot_err_lines; + } + if (r == ERR_AUTH) { + mylog(LOG_ERROR, "Invalid credentials"); + goto prot_err_lines; + } + /* XXX: not real error */ + if (r == OK_CLOSE) + goto prot_err_lines; + + if (oldtype == IRC_TYPE_LOGING_CLIENT && + TYPE(lc) == IRC_TYPE_CLIENT) { + list_remove(&connecting_c, lc); + list_add_last(&connected_c, lc); + } + } + list_free(linel); + continue; +prot_err_lines: + while ((line_s = list_remove_first(linel))) + free(line_s); +prot_err: + list_remove(&connl, conn); + if (linel) + list_free(linel); + if (lc) { + if (TYPE(lc) == IRC_TYPE_CLIENT) + list_remove(&connected_c, lc); + if (TYPE(lc) == IRC_TYPE_LOGING_CLIENT) + list_remove(&connecting_c, lc); + if (TYPE(lc) == IRC_TYPE_SERVER) + list_add_last(&timerwaitl, LINK(lc)); + irc_close(lc); + } + } + list_free(ready); + } + return; +} + +void irc_client_free(struct link_client *cli) +{ + if (CONN(cli)) + connection_free(CONN(cli)); + if (cli->init_pass) + free(cli->init_pass); + if (cli->init_nick) + free(cli->init_nick); + if (cli->init_user) + free(cli->init_user); + if (cli->init_real_name) + free(cli->init_real_name); + free(cli); +} + +/* +void irc_server_free(struct link_server *is) +{ + free(is); +} +*/ +struct link *irc_link_new() +{ + struct link *link; + link = calloc(sizeof(struct link), 1); + if (!link) + fatal("calloc"); + + hash_init(&link->chan_infos, HASH_NOCASE); + return link; +} + diff --git a/src/irc.h b/src/irc.h new file mode 100644 index 0000000..c10d783 --- /dev/null +++ b/src/irc.h @@ -0,0 +1,180 @@ +/* + * $Id: irc.h,v 1.43 2005/04/21 06:58:50 nohar Exp $ + * + * This file is part of the bip project + * Copyright (C) 2004 Arnaud Cornet and Loïc Gomez + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef IRC_H +#define IRC_H +#include "connection.h" +#include "line.h" + +#define P_SERV "bip.bip.bip" +#define S_PING "BIPPING" +#define P_IRCMASK "-bip!bip@bip.bip.bip" + +struct server { + char *host; + unsigned short port; +}; + +#define server_new() calloc(sizeof(struct server), 1) + +#define NICKOP 1 +#define NICKVOICED 2 + +struct nick { + char *name; + int ovmask; +}; + +struct channel { + char *name; + char *mode; + char *key; + char *topic; + int limit; + char type; + char *creator; + char *create_ts; + hash_t nicks; + int running_names; +}; + +#define IRC_TYPE_CLIENT (0) +#define IRC_TYPE_SERVER (1) +#define IRC_TYPE_LOGING_CLIENT (2) + +struct link { + char *name; /* id */ + + /** link live data **/ + struct link_server *l_server; + int l_clientc; + struct link_client **l_clientv; + + struct log *log; + + /* server related live stuff */ + int s_state; + char *prev_nick; + list_t init_strings; + + /* connection state (reconnecting, was_connected ...) */ + int recon_timer; + time_t last_reconnection; + + /** link options */ + + int follow_nick; + int ignore_first_nick; + char *on_connect_send; + char *away_nick; + hash_t chan_infos; /* channels we want */ + + /** client connection static data **/ + + char *login; + unsigned char *password; + unsigned int seed; + + /** server connection static data **/ + /* server list */ + int serverc; + struct server **serverv; + int cur_server; + + char *user; + char *real_name; + char *s_password; + char *connect_nick; + + /* socket creation info */ + char *vhost; + int bind_port; + int s_ssl; +}; + +struct link_connection { + int type; + connection_t *conn; + struct link *link; +}; + +struct link_any { + struct link_connection _link_c; +}; + +#define LINK(s) ((s)->_link_c.link) +#define CONN(s) ((s)->_link_c.conn) +#define TYPE(s) ((s)->_link_c.type) + +#define IRCC_NONE (0) +#define IRCC_NICK (1) +#define IRCC_USER (1<<1) +#define IRCC_PASS (1<<2) +#define IRCC_READY (IRCC_NICK|IRCC_PASS|IRCC_USER) + +struct link_client { + struct link_connection _link_c; + + char *init_nick; + char *init_pass; + char *init_user; + char *init_real_name; + int state; + int logging_timer; +}; + +#define link_client_new() calloc(sizeof(struct link_client), 1) + +#define IRCS_NONE (0) +#define IRCS_CONNECTING (1) +#define IRCS_CONNECTED (2) +#define IRCS_WAS_CONNECTED (3) +#define IRCS_RECONNECTING (4) + +struct log; + +struct chan_info { + char *name; + char *key; +}; + +#define chan_info_new() calloc(sizeof(struct chan_info), 1) + +struct link_server { + struct link_connection _link_c; + + char *nick; + + char *irc_mask; + + /* channels we are in */ + hash_t channels; + + char *user_mode; + int user_mode_len; + + /* init stuff */ + int lag; + int laginit_ts; + int lagtest_timeout; +}; + +struct link_server *irc_server_new(struct link *link, connection_t *conn); +void irc_server_free(struct link_server *is); +struct client *client_new(); +void irc_main(connection_t *inc, list_t *clientl); +int ischannel(char p); +void irc_client_close(struct link_client *); +void irc_client_free(struct link_client *); +struct link *irc_link_new(); +#endif diff --git a/src/lex.c b/src/lex.c new file mode 100644 index 0000000..93f1bfc --- /dev/null +++ b/src/lex.c @@ -0,0 +1,2065 @@ + +#line 3 "lex.yy.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 31 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int yyleng; + +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef unsigned int yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart (FILE *input_file ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +void yy_delete_buffer (YY_BUFFER_STATE b ); +void yy_flush_buffer (YY_BUFFER_STATE b ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state (void ); + +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); + +void *yyalloc (yy_size_t ); +void *yyrealloc (void *,yy_size_t ); +void yyfree (void * ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +typedef unsigned char YY_CHAR; + +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + +typedef int yy_state_type; + +extern int yylineno; + +int yylineno = 1; + +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + yyleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 43 +#define YY_END_OF_BUFFER 44 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[257] = + { 0, + 0, 0, 44, 42, 1, 2, 42, 42, 4, 41, + 38, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 39, 40, 1, + 0, 37, 0, 3, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, + + 0, 0, 12, 0, 17, 0, 0, 0, 0, 7, + 0, 0, 0, 5, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, + 0, 0, 0, 21, 36, 18, 0, 13, 0, 34, + + 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 27, 0, 29, + 0, 0, 0, 0, 0, 32, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 30, 0, 0, 0, 0, 8, 0, 0, + 35, 0, 0, 33, 31, 0 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 1, 5, 6, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 1, 8, 1, + 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 10, 1, 11, 12, 13, 14, + + 15, 16, 17, 18, 19, 1, 20, 21, 22, 23, + 24, 25, 1, 26, 27, 28, 29, 30, 31, 1, + 32, 1, 33, 1, 34, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[35] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1 + } ; + +static yyconst flex_int16_t yy_base[259] = + { 0, + 0, 0, 268, 269, 33, 269, 262, 263, 258, 269, + 269, 15, 253, 20, 28, 239, 23, 247, 237, 32, + 237, 31, 244, 30, 232, 230, 238, 269, 269, 56, + 250, 269, 251, 269, 246, 221, 240, 237, 238, 229, + 224, 225, 224, 217, 220, 269, 210, 224, 218, 211, + 225, 227, 226, 208, 220, 207, 221, 205, 201, 208, + 199, 212, 202, 214, 192, 203, 199, 206, 197, 192, + 197, 189, 192, 269, 43, 200, 183, 193, 200, 198, + 183, 199, 180, 186, 176, 179, 269, 189, 177, 175, + 169, 190, 178, 175, 174, 181, 180, 170, 269, 167, + + 43, 169, 269, 167, 269, 179, 165, 157, 171, 269, + 163, 170, 171, 269, 160, 154, 154, 157, 155, 163, + 149, 163, 144, 159, 149, 157, 147, 138, 269, 143, + 155, 144, 142, 146, 153, 137, 147, 150, 269, 150, + 140, 141, 136, 146, 127, 144, 143, 126, 121, 126, + 126, 128, 127, 123, 119, 123, 121, 269, 132, 119, + 128, 126, 128, 269, 110, 117, 112, 118, 111, 117, + 103, 117, 269, 108, 113, 113, 111, 110, 99, 108, + 111, 101, 99, 100, 94, 98, 97, 104, 93, 269, + 103, 88, 98, 269, 269, 269, 86, 269, 96, 269, + + 89, 93, 83, 92, 78, 75, 269, 83, 84, 72, + 73, 78, 74, 81, 269, 75, 67, 269, 70, 269, + 82, 63, 69, 74, 78, 269, 59, 58, 58, 269, + 60, 56, 55, 71, 65, 64, 61, 269, 50, 53, + 49, 51, 269, 52, 53, 41, 54, 269, 54, 55, + 269, 45, 42, 269, 269, 269, 60, 48 + } ; + +static yyconst flex_int16_t yy_def[259] = + { 0, + 256, 1, 256, 256, 256, 256, 257, 258, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 257, 256, 258, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 0, 256, 256 + } ; + +static yyconst flex_int16_t yy_nxt[304] = + { 0, + 4, 5, 6, 5, 7, 8, 9, 10, 11, 4, + 12, 13, 14, 4, 4, 15, 4, 16, 17, 18, + 19, 4, 20, 21, 22, 23, 24, 25, 26, 27, + 4, 4, 28, 29, 30, 36, 30, 39, 42, 45, + 40, 54, 49, 41, 58, 37, 50, 46, 33, 55, + 51, 43, 101, 59, 56, 52, 60, 30, 125, 30, + 31, 102, 255, 126, 254, 253, 252, 251, 127, 128, + 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, + 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, + 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, + + 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, + 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, + 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, + 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, + 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, + 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, + 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, + 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, + 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, + 130, 129, 124, 123, 114, 122, 121, 120, 119, 118, + + 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, + 107, 106, 105, 104, 103, 100, 99, 98, 97, 96, + 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, + 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, + 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, + 65, 64, 35, 34, 32, 63, 62, 61, 57, 53, + 48, 47, 44, 38, 35, 34, 32, 256, 3, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + + 256, 256, 256 + } ; + +static yyconst flex_int16_t yy_chk[304] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 5, 12, 5, 14, 15, 17, + 14, 22, 20, 14, 24, 12, 20, 17, 258, 22, + 20, 15, 75, 24, 22, 20, 24, 30, 101, 30, + 257, 75, 253, 101, 252, 250, 249, 247, 101, 101, + 246, 245, 244, 242, 241, 240, 239, 237, 236, 235, + 234, 233, 232, 231, 229, 228, 227, 225, 224, 223, + 222, 221, 219, 217, 216, 214, 213, 212, 211, 210, + + 209, 208, 206, 205, 204, 203, 202, 201, 199, 197, + 193, 192, 191, 189, 188, 187, 186, 185, 184, 183, + 182, 181, 180, 179, 178, 177, 176, 175, 174, 172, + 171, 170, 169, 168, 167, 166, 165, 163, 162, 161, + 160, 159, 157, 156, 155, 154, 153, 152, 151, 150, + 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, + 138, 137, 136, 135, 134, 133, 132, 131, 130, 128, + 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, + 117, 116, 115, 113, 112, 111, 109, 108, 107, 106, + 104, 102, 100, 98, 97, 96, 95, 94, 93, 92, + + 91, 90, 89, 88, 86, 85, 84, 83, 82, 81, + 80, 79, 78, 77, 76, 73, 72, 71, 70, 69, + 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, + 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, + 48, 47, 45, 44, 43, 42, 41, 40, 39, 38, + 37, 36, 35, 33, 31, 27, 26, 25, 23, 21, + 19, 18, 16, 13, 9, 8, 7, 3, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + + 256, 256, 256 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "lex.l" +#line 2 "lex.l" +/* + * $Id: lex.l,v 1.23 2005/04/12 19:34:35 nohar Exp $ + * + * This file is part of the bip proproject + * Copyright (C) 2004 Arnaud Cornet + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "conf.h" +int linec = 0; +#define YY_NO_UNPUT +#include "util.h" +extern int conf_error; +extern list_t *root_list; +void yyparse(void); +void free_conf(list_t*); + +list_t *parse_conf(FILE *file) +{ + YY_BUFFER_STATE in = yy_create_buffer(file,YY_BUF_SIZE); + yy_switch_to_buffer(in); + yyparse(); + if (conf_error) { + free_conf(root_list); + return NULL; + } + return root_list; +} +#line 625 "lex.yy.c" + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (void ); +#else +extern int yywrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 36 "lex.l" + +#line 778 "lex.yy.c" + + if ( (yy_init) ) + { + (yy_init) = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 257 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 269 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 37 "lex.l" + + YY_BREAK +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +#line 38 "lex.l" +{ linec++; } + YY_BREAK +case 3: +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 39 "lex.l" + + YY_BREAK +case 4: +YY_RULE_SETUP +#line 40 "lex.l" +{ + yylval.number = atoi(yytext); + return LEX_INT; + } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 44 "lex.l" +{ + yylval.number = strcmp(yytext, "true") + == 0 ? 1 : 0; + return LEX_BOOL; + } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 49 "lex.l" +{ return LEX_IP; } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 50 "lex.l" +{ return LEX_PORT; } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 51 "lex.l" +{ return LEX_CSS; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 52 "lex.l" +{ return LEX_SERVER; } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 53 "lex.l" +{ return LEX_NETWORK; } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 54 "lex.l" +{ return LEX_HOST; } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 55 "lex.l" +{ return LEX_NAME; } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 56 "lex.l" +{ return LEX_USERNAME; } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 57 "lex.l" +{ return LEX_USER; } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 58 "lex.l" +{ return LEX_LOGIN; } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 59 "lex.l" +{ return LEX_CONNECTION; } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 60 "lex.l" +{ return LEX_NICK; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 61 "lex.l" +{ return LEX_REALNAME; } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 62 "lex.l" +{ return LEX_SOURCE_PORT; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 63 "lex.l" +{ return LEX_VHOST; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 64 "lex.l" +{ return LEX_PASSWORD; } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 65 "lex.l" +{ return LEX_SSL; } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 66 "lex.l" +{ return LEX_KEY; } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 67 "lex.l" +{ return LEX_CHANNEL; } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 68 "lex.l" +{ return LEX_LOG_LEVEL; } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 69 "lex.l" +{ return LEX_LOG_ROOT; } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 70 "lex.l" +{ return LEX_LOG_FORMAT; } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 71 "lex.l" +{ return LEX_BACKLOG_LINES; } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 72 "lex.l" +{ return LEX_NO_BACKLOG; } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 73 "lex.l" +{ return LEX_ALWAYS_BACKLOG; } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 74 "lex.l" +{ return LEX_LOG_SYNC_INTERVAL; } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 75 "lex.l" +{ return LEX_FOLLOW_NICK; } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 76 "lex.l" +{ return LEX_IGN_FIRST_NICK; } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 77 "lex.l" +{ return LEX_AWAY_NICK; } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 78 "lex.l" +{ return LEX_ON_CONNECT_SEND; } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 79 "lex.l" +{ return LEX_PID_FILE; } + YY_BREAK +case 37: +/* rule 37 can match eol */ +YY_RULE_SETUP +#line 80 "lex.l" +{ + size_t len = strlen(yytext) - 2; + yylval.string = malloc(len + 1); + if (!yylval.string) + fatal("malloc"); + memcpy(yylval.string, yytext + 1, len); + yylval.string[len] = 0; + return LEX_STRING; + } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 89 "lex.l" +{ return LEX_EQ; } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 90 "lex.l" +{ return LEX_LBRA; } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 91 "lex.l" +{ return LEX_RBRA; } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 92 "lex.l" +{ return LEX_SEMICOLON; } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 93 "lex.l" +{ printf("Parse error line %d, unknown character '%s'\n", linec + 1, yytext); + return LEX_BUNCH; } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 95 "lex.l" +ECHO; + YY_BREAK +#line 1097 "lex.yy.c" +case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 257 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + register char *yy_cp = (yy_c_buf_p); + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 257 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 256); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart(yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ); + + yyfree((void *) b ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param str a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * yy_str ) +{ + + return yy_scan_bytes(yy_str,strlen(yy_str) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yyalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) +{ + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) +{ + return yytext; +} + +/** Set the current line number. + * @param line_number + * + */ +void yyset_lineno (int line_number ) +{ + + yylineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * in_str ) +{ + yyin = in_str ; +} + +void yyset_out (FILE * out_str ) +{ + yyout = out_str ; +} + +int yyget_debug (void) +{ + return yy_flex_debug; +} + +void yyset_debug (int bdebug ) +{ + yy_flex_debug = bdebug ; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *yyrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef yytext_ptr +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif +#line 95 "lex.l" + + + diff --git a/src/lex.l b/src/lex.l new file mode 100644 index 0000000..ebdf483 --- /dev/null +++ b/src/lex.l @@ -0,0 +1,95 @@ +%{ +/* + * $Id: lex.l,v 1.23 2005/04/12 19:34:35 nohar Exp $ + * + * This file is part of the bip proproject + * Copyright (C) 2004 Arnaud Cornet + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "conf.h" +int linec = 0; +#define YY_NO_UNPUT +#include "util.h" +extern int conf_error; +extern list_t *root_list; +void yyparse(void); +void free_conf(list_t*); + +list_t *parse_conf(FILE *file) +{ + YY_BUFFER_STATE in = yy_create_buffer(file, YY_BUF_SIZE); + yy_switch_to_buffer(in); + yyparse(); + if (conf_error) { + free_conf(root_list); + return NULL; + } + return root_list; +} +%} +%% +(" "|\t)+ +\n { linec++; } +"#"[^\n]*$ +[0-9]+ { + yylval.number = atoi(yytext); + return LEX_INT; + } +("true"|"false") { + yylval.number = strcmp(yytext, "true") + == 0 ? 1 : 0; + return LEX_BOOL; + } +"ip" { return LEX_IP; } +"port" { return LEX_PORT; } +"client_side_ssl" { return LEX_CSS; } +"server" { return LEX_SERVER; } +"network" { return LEX_NETWORK; } +"host" { return LEX_HOST; } +"name" { return LEX_NAME; } +"username" { return LEX_USERNAME; } +"user" { return LEX_USER; } +"login" { return LEX_LOGIN; } +"connection" { return LEX_CONNECTION; } +"nick" { return LEX_NICK; } +"realname" { return LEX_REALNAME; } +"source_port" { return LEX_SOURCE_PORT; } +"vhost" { return LEX_VHOST; } +"password" { return LEX_PASSWORD; } +"ssl" { return LEX_SSL; } +"key" { return LEX_KEY; } +"channel" { return LEX_CHANNEL; } +"log_level" { return LEX_LOG_LEVEL; } +"log_root" { return LEX_LOG_ROOT; } +"log_format" { return LEX_LOG_FORMAT; } +"backlog_lines" { return LEX_BACKLOG_LINES; } +"no_backlog" { return LEX_NO_BACKLOG; } +"always_backlog" { return LEX_ALWAYS_BACKLOG; } +"log_sync_interval" { return LEX_LOG_SYNC_INTERVAL; } +"follow_nick" { return LEX_FOLLOW_NICK; } +"ignore_first_nick" { return LEX_IGN_FIRST_NICK; } +"away_nick" { return LEX_AWAY_NICK; } +"on_connect_send" { return LEX_ON_CONNECT_SEND; } +"pid_file" { return LEX_PID_FILE; } +\"[^"]*\" { + size_t len = strlen(yytext) - 2; + yylval.string = malloc(len + 1); + if (!yylval.string) + fatal("malloc"); + memcpy(yylval.string, yytext + 1, len); + yylval.string[len] = 0; + return LEX_STRING; + } +"=" { return LEX_EQ; } +"{" { return LEX_LBRA; } +"}" { return LEX_RBRA; } +";" { return LEX_SEMICOLON; } +. { printf("Parse error line %d, unknown character '%s'\n", linec + 1, yytext); + return LEX_BUNCH; } +%% diff --git a/src/line.c b/src/line.c new file mode 100644 index 0000000..7952084 --- /dev/null +++ b/src/line.c @@ -0,0 +1,174 @@ +#include "config.h" +#include "line.h" + +void irc_line_init(struct line *l) +{ + memset(l, 0, sizeof(struct line)); +} + +struct line *irc_line_new() +{ + struct line *l; + l = malloc(sizeof(struct line)); + if (!l) + fatal("malloc"); + irc_line_init(l); + return l; +} + +void irc_line_clear(struct line *l) +{ + unsigned i; + for (i = 0; i < l->elemc; i++) + free(l->elemv[i]); + free(l->elemv); + if (l->origin) + free(l->origin); + memset(l, 0, sizeof(struct line)); +} + +void irc_line_write(struct line *l, connection_t *c) +{ + char *bytes = irc_line_to_string(l); + write_line(c, bytes); + free(bytes); +} + +struct line *irc_line_dup(struct line *line) +{ + unsigned i; + struct line *nl = irc_line_new(); + nl->origin = line->origin ? strdup(line->origin) : NULL; + nl->elemc = line->elemc; + nl->elemv = malloc(sizeof(char *) * line->elemc); + for (i = 0; i < line->elemc; i++) + nl->elemv[i] = strdup(line->elemv[i]); + nl->colon = line->colon; + return nl; +} + +void _irc_line_append(struct line *l, char *s) +{ + l->elemc++; + l->elemv = realloc(l->elemv, l->elemc * sizeof(char *)); + if (!l) + fatal("realloc"); + l->elemv[l->elemc - 1] = s; +} + +void irc_line_append(struct line *l, char *s) +{ + _irc_line_append(l, strdup(s)); +} + +char *irc_line_to_string(struct line *l) +{ + size_t len = 0; + unsigned i; + char *ret; + + if (l->origin) + len = strlen(l->origin) + 2; + for (i = 0; i < l->elemc; i++) + len += strlen(l->elemv[i]) + 1; + len += 1; /* remove one trailing space and add \r\n */ + len++; /* last args ":" */ + ret = malloc(len + 1); + ret[0] = 0; + + if (l->origin) { + strcat(ret, ":"); + strcat(ret, l->origin); + strcat(ret, " "); + } + for (i = 0; i < l->elemc - 1; i++) { + strcat(ret, l->elemv[i]); + strcat(ret, " "); + } + if (strchr(l->elemv[i], ' ') || l->colon) + strcat(ret, ":"); + + strcat(ret, l->elemv[i]); + strcat(ret, "\r\n"); + return ret; +} + +/* + * takes a null terminated string as input w/o \r\n + */ +struct line *irc_line(char *str) +{ + struct line *line; + char *space; + size_t len; + int curelem = 0; + + line = calloc(sizeof(struct line), 1); + if (!line) + fatal("calloc"); + if (str[0] == ':') { + space = str + 1; + + while (*space && *space != ' ') + space++; + if (!*space) + return NULL; + len = space - str - 1; /* leading ':' */ + line->origin = malloc(len + 1); + if (!line->origin) + fatal("malloc"); + memcpy(line->origin, str + 1, len); + line->origin[len] = 0; + str = space; + } + + while (*str == ' ') + str++; + + while (*str) { + char *tmp; + + line->elemc++; + line->elemv = realloc(line->elemv, + line->elemc * sizeof(char *)); + if (!line->elemv) + fatal("realloc"); + + space = str; + if (*space == ':') { + line->colon = 1; + str++; + while (*space) + space++; + } else { + while (*space && *space != ' ') + space++; + } + len = space - str; + tmp = line->elemv[curelem] = malloc(len + 1); + if (!tmp) + fatal("malloc"); + memcpy(tmp, str, len); + tmp[len] = 0; + if (curelem == 0) + strucase(line->elemv[curelem]); + + curelem++; + + str = space; + while (*str == ' ') + str++; + } + return line; +} + +void irc_line_free(struct line *l) +{ + unsigned i; + for (i = 0; i < l->elemc; i++) + free(l->elemv[i]); + free(l->elemv); + if (l->origin) + free(l->origin); + free(l); +} diff --git a/src/line.h b/src/line.h new file mode 100644 index 0000000..449cc4b --- /dev/null +++ b/src/line.h @@ -0,0 +1,74 @@ +#ifndef IRC_LINE_H +#define IRC_LINE_H + +#include "connection.h" + +#define WRITE_LINE1(con, org, com, a) \ + do { \ + struct line l; \ + irc_line_init(&l); \ + l.origin = org; \ + _irc_line_append(&l, com); \ + _irc_line_append(&l, a); \ + irc_line_write(&l, con); \ + free(l.elemv); \ + } while(0) + +#define WRITE_LINE2(con, org, com, a1, a2) \ + do { \ + struct line l; \ + irc_line_init(&l); \ + l.origin = org; \ + _irc_line_append(&l, com); \ + _irc_line_append(&l, a1); \ + _irc_line_append(&l, a2); \ + irc_line_write(&l, con); \ + free(l.elemv); \ + } while(0) + +#define WRITE_LINE3(con, org, com, a1, a2, a3) \ + do { \ + struct line l; \ + irc_line_init(&l); \ + l.origin = org; \ + _irc_line_append(&l, com); \ + _irc_line_append(&l, a1); \ + _irc_line_append(&l, a2); \ + _irc_line_append(&l, a3); \ + irc_line_write(&l, con); \ + free(l.elemv); \ + } while(0) + +#define WRITE_LINE4(con, org, com, a1, a2, a3, a4) \ + do { \ + struct line l; \ + irc_line_init(&l); \ + l.origin = org; \ + _irc_line_append(&l, com); \ + _irc_line_append(&l, a1); \ + _irc_line_append(&l, a2); \ + _irc_line_append(&l, a3); \ + _irc_line_append(&l, a4); \ + irc_line_write(&l, con); \ + free(l.elemv); \ + } while(0) + +struct line { + char *origin; + unsigned int elemc; + char **elemv; + int colon; +}; + +void irc_line_init(struct line *l); +struct line *irc_line_new(); +void irc_line_clear(struct line *l); +void irc_line_write(struct line *l, connection_t *c); +void irc_line_append(struct line *l, char *s); +struct line *irc_line(char *str); +char *irc_line_to_string(struct line *l); +void irc_line_free(struct line *l); +struct line *irc_line_dup(struct line *line); +void _irc_line_append(struct line *l, char *s); + +#endif diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..d6c21e3 --- /dev/null +++ b/src/log.c @@ -0,0 +1,870 @@ +/* + * $Id: log.c,v 1.56 2005/04/21 06:58:50 nohar Exp $ + * + * This file is part of the bip project + * Copyright (C) 2004 Arnaud Cornet and Loïc Gomez + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "config.h" +#include "log.h" +#include "irc.h" +#include "util.h" + +extern int errno; +extern int log_level; +extern char *conf_log_root; +extern char *conf_log_format; + +/* conf_always_backlog => conf_backlog_lines != 0 */ +extern int conf_no_backlog; +extern int conf_backlog_lines; +extern int conf_always_backlog; + +int log_set_backlog_offset(log_t *logdata, char *dest); +static int _log_write(log_t *logdata, logfilegroup_t *lf, char *str); +void logfile_free(logfile_t *lf); + +/* TODO: change fatal("out of memory") to cleanup & return NULL */ + +int check_dir(char *filename) +{ + int err; + struct stat statbuf; + + err = stat(filename, &statbuf); + if (err && errno == ENOENT) { + err = mkdir(filename, 0750); + if (err) { + mylog(LOG_ERROR, "mkdir(%s) %s", filename, + strerror(errno)); + return 1; + } + } else if (err) { + mylog(LOG_ERROR, "stat(%s) %s", filename, + strerror(errno)); + return 1; + } else if (!(statbuf.st_mode & S_IFDIR)) { + mylog(LOG_ERROR, "%s is not a directory", filename); + return 1; + } + + return 0; +} + +int check_dir_r(char *dirname) +{ + int pos, count = 0; + char *dir, *tmp; + int len = strlen(dirname); + + mylog(LOG_DEBUGVERB, "Recursive check of %s engaged", dirname); + tmp = dirname; + dir = (char *)malloc(sizeof(char) * (len + 1)); + while (*tmp) { + int slash_ok = 1; + while (*tmp == '/') { + if (slash_ok) { + strncpy(dir + count, "/", 1); + count++; + slash_ok = 0; + } + tmp++; + } + pos = strcspn(tmp, "/"); + strncpy(dir + count, tmp, pos); + tmp += pos; + count += pos; + *(dir + count) = '\0'; + mylog(LOG_DEBUGVERB,"check_dir_r: %s", dir); + if (check_dir(dir)) { + free(dir); + return 1; + } + } + free(dir); + return 0; +} + +void strtolower(char *str) +{ + char *c; + + for (c = str; *c != '\0'; c++) + *c = tolower(*c); +} + +/* + * Replace all occurences of var in str by value. + * This function modifies its first argument! + * Truncate the string after max characters. + */ +void replace_var(char *str, char *var, char *value, unsigned int max) +{ + char *pos; + unsigned int lenvar = strlen(var); + unsigned int lenval = strlen(value); + while((pos = strstr(str, var))) { + /* Make room */ + if (strlen(str) + (lenval - lenvar) >= max) + return; + memmove(pos + lenval, pos + lenvar, + (strlen(pos + lenvar) + 1)*sizeof(char)); + memcpy(pos, value, lenval*sizeof(char)); + } +} + +char *log_build_filename(log_t *logdata, char *destination) +{ + char *logfile, year[5], day[3], month[3], *tmp, *logdir; + int log_format_len; + struct tm *now; + time_t s; + char *dest = strdup(destination); + strtolower(dest); + + log_format_len = strlen(conf_log_format); + logfile = (char*)malloc((MAX_PATH_LEN + 1)*sizeof(char)); + if (!logfile) + fatal("out of memory"); + + time(&s); + now = localtime(&s); + snprintf(year, 5, "%04d", now->tm_year + 1900); + snprintf(day, 3, "%02d", now->tm_mday); + snprintf(month, 3, "%02d", now->tm_mon + 1); + snprintf(logfile, MAX_PATH_LEN, "%s/%s", conf_log_root, + conf_log_format); + replace_var(logfile, "%u", logdata->user, MAX_PATH_LEN); + replace_var(logfile, "%n", logdata->network, MAX_PATH_LEN); + replace_var(logfile, "%c", dest, MAX_PATH_LEN); + replace_var(logfile, "%Y", year, MAX_PATH_LEN); + replace_var(logfile, "%d", day, MAX_PATH_LEN); + replace_var(logfile, "%m", month, MAX_PATH_LEN); + + logdir = strdup(logfile); + if (!logdir) + fatal("out of memory"); + + /* strrchr works on bytes, not on char (if sizeof(char) != 1) */ + tmp = strrchr(logdir, '/'); + if (tmp) + *tmp = '\0'; + + free(dest); + if (check_dir_r(logdir)) { + free(logfile); + free(logdir); + return NULL; + } + free(logdir); + return logfile; +} + +void log_updatelast(logfile_t *lf) +{ + time_t t; + + time(&t); + localtime_r(&t, &lf->last_log); +} + +void log_reinit(logfilegroup_t *lfg) +{ + mylog(LOG_ERROR, "%s is inconsistant, droping backlog info\n", + lfg->name); + logfile_t *olf; + while ((olf = list_get_first(&lfg->file_group)) != + list_get_last(&lfg->file_group)) { + logfile_free(olf); + list_remove_first(&lfg->file_group); + } + if (!olf->file) + fatal("internal, (NULL logfile)"); + fseek(olf->file, 0, SEEK_END); + olf->len = ftell(olf->file); + olf->backlog_offset = olf->len; +} + +static int log_add_file(log_t *logdata, char *destination, char *filename) +{ + FILE *f; + logfile_t *lf; + logfilegroup_t *lfg; + + f = fopen(filename, "a+"); + if (!f) { + mylog(LOG_ERROR, "fopen(%s) %s", filename, strerror(errno)); + return 0; + } + + lf = malloc(sizeof(logfile_t)); + if (!lf) + fatal("out of memory"); + lf->file = f; + lf->filename = strdup(filename); + if (!lf->filename) + fatal("out of memory"); + + fseek(lf->file, 0, SEEK_END); + if (ftell(f) < 0) + fatal("ftell"); + lf->len = ftell(f); + lf->backlog_offset = lf->len; + log_updatelast(lf); + + lfg = hash_get(&logdata->logfgs, destination); + if (!lfg) { + lfg = malloc(sizeof(logfilegroup_t)); + if (!lfg) + fatal("out of memory"); + list_init(&lfg->file_group, NULL); + lfg->name = strdup(destination); + if (!lfg->name) + fatal("out of memory"); + lfg->skip_advance = 0; + hash_insert(&logdata->logfgs, destination, lfg); + } + list_add_last(&lfg->file_group, lf); + return 1; +} + +/* + * XXX: must not free file_group + */ +void logfile_free(logfile_t *lf) +{ + if (!lf) + return; + if (lf->file) + fclose(lf->file); + if (lf->filename) + free(lf->filename); + free(lf); +} + +logfilegroup_t *log_find_file(log_t *logdata, char *destination) +{ + logfile_t *lf; + logfilegroup_t *lfg; + char *filename; + time_t t; + struct tm *ltime; + + if (!ischannel(*destination)) + destination = "privates"; + + lfg = hash_get(&logdata->logfgs, destination); + + if (!lfg) { + filename = log_build_filename(logdata, destination); + if (!filename) + return NULL; + + mylog(LOG_DEBUG, "Creating new logfile for %s: %s", destination, + filename); + if (!log_add_file(logdata, destination, filename)) { + free(filename); + return NULL; + } + lfg = hash_get(&logdata->logfgs, destination); + if (!lfg) + fatal("internal log_find_file"); + free(filename); + return lfg; + } + /* This is reached if lfg already exists */ + time(&t); + ltime = localtime(&t); + lf = list_get_last(&lfg->file_group); + if (ltime->tm_mday != lf->last_log.tm_mday) { + logfile_t *oldlf; + + /* day changed, we might want to rotate logfile */ + filename = log_build_filename(logdata, destination); + if (!filename) + return NULL; + + if (strcmp(lf->filename, filename) == 0) { + /* finally we don't */ + free(filename); + return lfg; + } + + /* we do want do rotate logfiles */ + mylog(LOG_DEBUG, "Rotating logfile for %s from", destination); + oldlf = list_get_last(&lfg->file_group); + if (!log_add_file(logdata, destination, filename)) { + free(filename); + return NULL; + } + free(filename); + + if (conf_no_backlog) { + /* remove oldlf from file_group */ + if (list_remove_first(&lfg->file_group) != oldlf) + fatal("internal log_find_file 2"); + logfile_free(oldlf); + if (list_get_first(&lfg->file_group) + != list_get_last(&lfg->file_group)) + fatal("internal log_find_file 3"); + } else { + fclose(oldlf->file); + oldlf->file = NULL; + } + } + return lfg; +} + +/* + * Da log routines + */ +void log_join(log_t *logdata, char *ircmask, char *channel) +{ + snprintf(logdata->buffer, LOGLINE_MAXLEN, + "%s -!- %s has joined %s\n", timestamp(), ircmask, + channel); + log_write(logdata, channel, logdata->buffer); +} + +void log_part(log_t *logdata, char *ircmask, char *channel, + char *message) +{ + snprintf(logdata->buffer, LOGLINE_MAXLEN, + "%s -!- %s has left %s [%s]\n", timestamp(), ircmask, + channel, message); + log_write(logdata, channel, logdata->buffer); +} + +void log_kick(log_t *logdata, char *ircmask, char *channel, + char *who, char *message) +{ + snprintf(logdata->buffer, LOGLINE_MAXLEN, + "%s -!- %s has been kicked by %s [%s]\n", timestamp(), + who, ircmask, message); + log_write(logdata, channel, logdata->buffer); +} + +void log_quit(log_t *logdata, char *ircmask, char *channel, char *message) +{ + snprintf(logdata->buffer, LOGLINE_MAXLEN, + "%s -!- %s has quit [%s]\n", timestamp(), ircmask, + message); + log_write(logdata, channel, logdata->buffer); +} + +void log_nick(log_t *logdata, char *ircmask, char *channel, char *newnick) +{ + snprintf(logdata->buffer, LOGLINE_MAXLEN, + "%s -!- %s is now known as %s\n", + timestamp(), ircmask, newnick); + log_write(logdata, channel, logdata->buffer); +} + +void log_privmsg(log_t *logdata, char *ircmask, char *destination, + char *message) +{ + if (!ircmask) + ircmask = "Server message"; + if (*message == '\001' && *(message + strlen(message) - 1) == '\001') { + char *msg = strdup(message); + if (!msg) + fatal("out of memory"); + if (strncmp(msg, "\001ACTION ", 8) != 0) { + free(msg); + return; + } + *(msg + strlen(msg) - 1) = '\0'; + snprintf(logdata->buffer, LOGLINE_MAXLEN, "%s * %s %s\n", + timestamp(), ircmask, msg + 8); + free(msg); + } else { + snprintf(logdata->buffer, LOGLINE_MAXLEN, "%s %s: %s\n", + timestamp(), ircmask, message); + } + log_write(logdata, destination, logdata->buffer); +} + +void log_notice(log_t *logdata, char *ircmask, char *channel, + char *message) +{ + if (!ircmask) + ircmask = "Server message"; + if (*message == '\001' && *(message + strlen(message) - 1) == '\001') + return; + snprintf(logdata->buffer, LOGLINE_MAXLEN, "%s %s: %s %s\n", timestamp(), + ircmask, channel, message); + log_write(logdata, channel, logdata->buffer); +} + +void log_topic(log_t *logdata, char *ircmask, char *channel, char *message) +{ + snprintf(logdata->buffer, LOGLINE_MAXLEN, + "%s -!- %s changed topic of %s to: %s\n", timestamp(), + ircmask, channel, message); + log_write(logdata, channel, logdata->buffer); +} + +void log_init_topic(log_t *logdata, char *channel, char *message) +{ + snprintf(logdata->buffer, LOGLINE_MAXLEN, + "%s -!- Topic for %s: %s\n", timestamp(), channel, + message); + log_write(logdata, channel, logdata->buffer); +} + +void log_init_topic_time(log_t *logdata, char *channel, char *who, char *when) +{ + struct tm *time; + char *timestr; + time_t seconds; + + seconds = atoi(when); + time = localtime(&seconds); + timestr = (char*)malloc(sizeof(char) * (50 + 1)); + timestr[0] = '\0'; + if (time) + strftime(timestr, 50, "%A %d %B %Y, %H:%M:%S", time); + timestr[50] = '\0'; + + snprintf(logdata->buffer, LOGLINE_MAXLEN, + "%s -!- Topic set by %s [%s]\n", timestamp(), who, + timestr); + free(timestr); + log_write(logdata, channel, logdata->buffer); +} + +void log_mode(log_t *logdata, char *ircmask, char *channel, char *modes, + char **modargv, unsigned modargc) +{ + unsigned i; + snprintf(logdata->buffer, LOGLINE_MAXLEN, "%s -!- mode/%s [%s ", + timestamp(), channel, modes); + log_write(logdata, channel, logdata->buffer); + for (i = 0; i < modargc; i++) { + snprintf(logdata->buffer, LOGLINE_MAXLEN, "%s%c", modargv[i], + i == modargc-1 ? ']' : ' '); + log_write(logdata, channel, logdata->buffer); + } + snprintf(logdata->buffer, LOGLINE_MAXLEN, " by %s\n", ircmask); + log_write(logdata, channel, logdata->buffer); +} + +void log_disconnected(log_t *logdata) +{ + logfilegroup_t *lfg; + hash_iterator_t hi; + snprintf(logdata->buffer, LOGLINE_MAXLEN, "%s -!- Disconnected" + " from server...\n", timestamp()); + for (hash_it_init(&logdata->logfgs, &hi); hash_it_item(&hi); + hash_it_next(&hi)) { + lfg = hash_it_item(&hi); + _log_write(logdata, lfg, logdata->buffer); + } +} + +void log_ping_timeout(log_t *logdata) +{ + snprintf(logdata->buffer, LOGLINE_MAXLEN, + "%s -!- Ping timeout with server...\n", timestamp()); + log_write(logdata, "privates", logdata->buffer); + log_disconnected(logdata); +} + +void log_connected(log_t *logdata) +{ + logfilegroup_t *lfg; + hash_iterator_t hi; + snprintf(logdata->buffer, LOGLINE_MAXLEN, "%s -!- Connected to" + " server...\n", timestamp()); + for (hash_it_init(&logdata->logfgs, &hi); hash_it_item(&hi); + hash_it_next(&hi)) { + lfg = hash_it_item(&hi); + _log_write(logdata, lfg, logdata->buffer); + } +} + +void log_client_disconnected(log_t *logdata) +{ + mylog(LOG_DEBUG, "A client disconnected"); +} + +void log_client_none_connected(log_t *logdata) +{ + logfilegroup_t *lfg; + logfile_t *lf; + hash_iterator_t hi; + + logdata->connected = 0; + + if (conf_always_backlog) + return; + + for (hash_it_init(&logdata->logfgs, &hi); hash_it_item(&hi); + hash_it_next(&hi)) { + lfg = hash_it_item(&hi); + lf = list_get_last(&lfg->file_group); + if (lf != list_get_first(&lfg->file_group)) + fatal("internal log_client_none_connected"); + lf->backlog_offset = lf->len; + lfg->skip_advance = 0; + } +} + +void log_client_connected(log_t *logdata) +{ + mylog(LOG_DEBUG, "A client connected"); + logdata->connected = 1; +} + +void log_advance_backlogs(log_t* ld, logfilegroup_t *lfg) +{ + int c; + if (conf_no_backlog || conf_backlog_lines == 0) + return; + + if (lfg->skip_advance < conf_backlog_lines) { + lfg->skip_advance++; + return; + } + + logfile_t *lf; + while ((lf = list_get_first(&lfg->file_group))) { + if (!lf->file) { + lf->file = fopen(lf->filename, "r"); + if (!lf->file) { + mylog(LOG_ERROR, "Can't open %s for reading", + lf->filename); + log_reinit(lfg); + return; + } + } + if (fseek(lf->file, lf->backlog_offset, SEEK_SET)) { + log_reinit(lfg); + return; + } + + while ((c = fgetc(lf->file)) != EOF) { + lf->backlog_offset++; + if (c == '\n') + return; + } + if (lf == list_get_last(&lfg->file_group)) + return; + fclose(lf->file); + lf->file = NULL; + list_remove_first(&lfg->file_group); + logfile_free(lf); + } +} + +int log_has_backlog(log_t *logdata, char *destination) +{ + logfilegroup_t *lfg = hash_get(&logdata->logfgs, destination); + + if (!lfg) + return 0; + + logfile_t *lf; + lf = list_get_first(&lfg->file_group); + if (lf != list_get_last(&lfg->file_group)) + return 1; + + return lf->backlog_offset != lf->len; +} + +#define BOLD_CHAR 0x02 +#define LAMESTRING "!bip@bip.bip.bip PRIVMSG " + +static char *log_beautify(char *buf, char *dest, int *raw) +{ + int action = 0; + char *p; + /* + * so = start, lo = length + * ts = timestamp, n = sender nick, m = message or action + */ + char *sots, *son, *som; + size_t lots, lon, lom; + char *ret; + + *raw = 0; + if (!buf) + return NULL; + + p = strchr(buf, ' '); + if (!p || !p[0] || !p[1]) + return buf; + p++; + sots = p; + p = strchr(p, ' '); + if (!p || !p[0] || !p[1]) + return buf; + lots = p - sots; + p++; + if (strncmp(p, "-!-", 3) == 0) + return buf; + if (*p == '*') { + action = 1; + if (!p[1] || !p[2]) + return buf; + p += 2; + } + son = p; + /* 'date time blawithnoexcl bla bla ! bla' --> ? */ + p = strchr(p, '!'); + if (!p || !p[0] || !p[1]) + return buf; + lon = p - son; + p = strchr(p, ' '); + if (!p || !p[0] || !p[1]) + return buf; + p++; + som = p; + lom = strlen(p); + + *raw = 1; + p = ret = (char *)malloc( + 1 + lon + strlen(LAMESTRING) + strlen(dest) + 2 + lots + + 1 + lom + 3 + action * (2 + strlen("ACTION"))); + if (!p) + fatal("out of memory"); + *p++ = ':'; + memcpy(p, son, lon); + p += lon; + strcpy(p, LAMESTRING); + p += strlen(LAMESTRING); + strcpy(p, dest); + p += strlen(dest); + strcpy(p, " :"); + p += 2; + if (action) { + *p++ = 1; + memcpy(p, "ACTION", strlen("ACTION")); + p += strlen("ACTION"); + } + memcpy(p, sots, lots); + p+=lots; + *p++ = ' '; + memcpy(p, som, lom); + p += lom; + if (action) + *p++ = 1; + *p++ = '\r'; + *p++ = '\n'; + *p = 0; + free(buf); + return ret; +} + +char *log_backread(log_t *logdata, char *destination, int *raw) +{ + char *buf; + size_t pos = 0; + logfile_t *lf; + logfilegroup_t *lfg; + int c; + + if (!conf_always_backlog && logdata->connected) + return NULL; + + buf = (char *)malloc((LOGLINE_MAXLEN + 1) * sizeof(char)); + lfg = hash_get(&logdata->logfgs, destination); + + if (!lfg) + return NULL; + + if (!logdata->backlogging) { + list_it_init(&lfg->file_group, &logdata->file_it); + logdata->backlogging = 1; + } +next_file: + /* check the files containing data to backlog */ + lf = list_it_item(&logdata->file_it); + if (lf != list_get_last(&lfg->file_group)) { + /* if the file is not the current open for logging + * (it is an old file that has been rotated) + * open if necessary, backlog line per line, and close */ + if (!lf->file) { + lf->file = fopen(lf->filename, "r"); + if (!lf->file) { + mylog(LOG_ERROR, "Can't open %s for reading", + lf->filename); + log_reinit(lfg); + return strdup("Error reading logfile"); + } + if (fseek(lf->file, lf->backlog_offset, SEEK_SET)) { + log_reinit(lfg); + return strdup("Error reading in logfile"); + } + } + for(;;) { + c = fgetc(lf->file); + if (!conf_always_backlog) + lf->backlog_offset++; + if (c == EOF || c == '\n' + || pos + 1 >= LOGLINE_MAXLEN) { + if (c == EOF) { + list_it_next(&logdata->file_it); + if (!conf_always_backlog) { + list_remove_first( + &lfg->file_group); + logfile_free(lf); + } else { + fclose(lf->file); + lf->file = NULL; + } + + pos = 0; + goto next_file; + } + buf[pos] = 0; + return log_beautify(buf, destination, raw); + } + buf[pos++] = c; + } + } + + /* the logfile to read is the one open for writing */ + if (!logdata->lastfile_seeked) { + if (fseek(lf->file, lf->backlog_offset, SEEK_SET)) { + log_reinit(lfg); + return strdup("Error reading in logfile"); + } + logdata->lastfile_seeked = 1; + } + + c = fgetc(lf->file); + if (c == EOF) { + logdata->lastfile_seeked = 0; + logdata->backlogging = 0; + free(buf); + return NULL; + } + if (!conf_always_backlog) + lf->backlog_offset++; + + if (c != '\n') + buf[pos++] = c; + for(;;) { + c = fgetc(lf->file); + if (!conf_always_backlog) + lf->backlog_offset++; + if (c == EOF || c == '\n' || pos + 1 >= LOGLINE_MAXLEN) { + if (conf_always_backlog && c == EOF) + lf->backlog_offset--; + buf[pos] = 0; + return log_beautify(buf, destination, raw); + } + buf[pos++] = c; + } + /* unreachable */ + fatal("internal error 12"); + return NULL; +} + +static int _log_write(log_t *logdata, logfilegroup_t *lfg, char *str) +{ + size_t nbwrite; + size_t len; + logfile_t *lf = list_get_last(&lfg->file_group); + + len = strlen(str); + nbwrite = fwrite(str, sizeof(char), len, lf->file); + log_updatelast(lf); + if (nbwrite != len) + mylog(LOG_ERROR, "Error writing to %s logfile", lf->filename); + lf->len += nbwrite; + if (!logdata->connected || conf_always_backlog) + log_advance_backlogs(logdata, lfg); + return nbwrite; +} + +void log_write(log_t *logdata, char *destination, char *str) +{ + logfilegroup_t *lfg = log_find_file(logdata, destination); + if (!lfg) { + mylog(LOG_ERROR, "Unable to find/create logfile for '%s'", + destination); + return; + } + _log_write(logdata, lfg, str); +} + +static list_t *log_all_logs = NULL; + +void log_flush_all(void) +{ + list_iterator_t li; + if (!log_all_logs) + return; + + for (list_it_init(log_all_logs, &li); list_it_item(&li); + list_it_next(&li)) { + log_t *log = list_it_item(&li); + hash_iterator_t hi; + for (hash_it_init(&log->logfgs, &hi); hash_it_item(&hi); + hash_it_next(&hi)) { + logfilegroup_t *lfg = hash_it_item(&hi); + list_iterator_t lj; + for (list_it_init(&lfg->file_group, &lj); + list_it_item(&lj); list_it_next(&lj)) { + logfile_t *lf = list_it_item(&lj); + if (lf->file) + fflush(lf->file); + } + } + } +} + +log_t *log_new(char *user, char *network) +{ + log_t *logdata; + + logdata = (log_t*)calloc(sizeof(log_t), 1); + if (!logdata) + fatal("out of memory"); + logdata->user = strdup(user); + logdata->network = strdup(network); + hash_init(&logdata->logfgs, HASH_NOCASE); + logdata->buffer = (char *)malloc(LOGLINE_MAXLEN * sizeof(char)); + if (!logdata->user || !logdata->network || !logdata->buffer) + fatal("out of memory"); + logdata->connected = 0; + if (!log_all_logs) + log_all_logs = list_new(NULL); + list_add_last(log_all_logs, logdata); + return logdata; +} + +#ifdef TEST +int main(void) +{ + log_t *logdata; + + log_level = 4; + check_dir_r("/home/bip//subdir///subdir2"); + + conf_log_root = "/home/bip/logs"; + conf_log_format = "%n/%Y-%m/%c.%d.log"; + logdata = log_new(strdup("Marmite")); + log_privmsg(logdata, strdup("blah!ident@host"), strdup("to"), + strdup("Message")); + log_privmsg(logdata, strdup("blah!ident@host"), strdup("to"), + strdup("Message")); + log_join(logdata, strdup("blah!ident@host"), strdup("#pOrcSy")); + log_part(logdata, strdup("blah!ident@host"), strdup("#bip"), + strdup("blah")); + log_privmsg(logdata, strdup("blah!ident@host"), strdup("#poRcsy"), + strdup("Message")); + log_join(logdata, strdup("blah!ident@host"), strdup("#marmite")); + log_join(logdata, strdup("blah!ident@host"), strdup("#bip")); + log_join(logdata, strdup("blah!ident@host"), strdup("#bip")); + return 0; +} +#endif diff --git a/src/log.h b/src/log.h new file mode 100644 index 0000000..3566556 --- /dev/null +++ b/src/log.h @@ -0,0 +1,87 @@ +/* + * $Id: log.h,v 1.26 2005/04/12 19:34:35 nohar Exp $ + * + * This file is part of the bip project + * Copyright (C) 2004 Arnaud Cornet and Loïc Gomez + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef LOG_H +#define LOG_H +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +#define MAX_PATH_LEN 1024 +#define LOGLINE_MAXLEN 400 + +#define S_PRIVATES "privates" + +struct list; + +typedef struct logfile { + FILE *file; + char *filename; + struct tm last_log; + size_t backlog_offset; + size_t len; +} logfile_t; + +typedef struct logfilegroup +{ + char *name; + list_t file_group; + int skip_advance; +} logfilegroup_t; + +typedef struct log { + hash_t logfgs; + char *network; + char *user; + char *buffer; + int connected; + int backlogging; + list_iterator_t file_it; + int lastfile_seeked; +} log_t; + +void log_close_all(log_t *logdata); +log_t *log_new(char *user, char *network); +void logdata_free(log_t *logdata); +int log_compare_files(logfile_t *f1, char *f2); + +void log_join(log_t *logdata, char *ircmask, char *channel); +void log_part(log_t *logdata, char *ircmask, char *channel, char *message); +void log_kick(log_t *logdata, char *ircmask, char *channel, char *who, + char *message); +void log_quit(log_t *logdata, char *ircmask, char *channel, char *message); +void log_nick(log_t *logdata, char *ircmask, char *channel, char *newnick); +void log_privmsg(log_t *logdata, char *ircmask, char *destination, + char *message); +void log_notice(log_t *logdata, char *ircmask, char *channel, char *message); +void log_write(log_t *logdata, char *str, char *destination); +void log_mode(log_t *logdata, char *ircmask, char *channel, + char *modes, char **modargv, unsigned modargc); +void log_topic(log_t *logdata, char *ircmask, char *channel, char *message); +void log_init_topic(log_t *logdata, char *channel, char *message); +void log_init_topic_time(log_t *logdata, char *channel, char *who, char *when); +void log_connected(log_t *logdata); +void log_disconnected(log_t *logdata); +void log_ping_timeout(log_t *logdata); +void log_client_disconnected(log_t *logdata); +void log_client_connected(log_t *logdata); +char *log_backread(log_t *logdata, char *destination, int *raw); +int log_has_backlog(log_t *logdata, char *destination); +void log_flush_all(void); +void log_client_none_connected(log_t *logdata); +#endif diff --git a/src/md5.c b/src/md5.c new file mode 100644 index 0000000..e72563f --- /dev/null +++ b/src/md5.c @@ -0,0 +1,418 @@ +/* + * RFC 1321 compliant MD5 implementation + * + * Copyright (C) 2001-2003 Christophe Devine + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include + +#include "md5.h" + +#define GET_UINT32(n,b,i) \ +{ \ + (n) = ( (uint32) (b)[(i) ] ) \ + | ( (uint32) (b)[(i) + 1] << 8 ) \ + | ( (uint32) (b)[(i) + 2] << 16 ) \ + | ( (uint32) (b)[(i) + 3] << 24 ); \ +} + +#define PUT_UINT32(n,b,i) \ +{ \ + (b)[(i) ] = (uint8) ( (n) ); \ + (b)[(i) + 1] = (uint8) ( (n) >> 8 ); \ + (b)[(i) + 2] = (uint8) ( (n) >> 16 ); \ + (b)[(i) + 3] = (uint8) ( (n) >> 24 ); \ +} + +void md5_starts( md5_context *ctx ) +{ + ctx->total[0] = 0; + ctx->total[1] = 0; + + ctx->state[0] = 0x67452301; + ctx->state[1] = 0xEFCDAB89; + ctx->state[2] = 0x98BADCFE; + ctx->state[3] = 0x10325476; +} + +void md5_process( md5_context *ctx, uint8 data[64] ) +{ + uint32 X[16], A, B, C, D; + + GET_UINT32( X[0], data, 0 ); + GET_UINT32( X[1], data, 4 ); + GET_UINT32( X[2], data, 8 ); + GET_UINT32( X[3], data, 12 ); + GET_UINT32( X[4], data, 16 ); + GET_UINT32( X[5], data, 20 ); + GET_UINT32( X[6], data, 24 ); + GET_UINT32( X[7], data, 28 ); + GET_UINT32( X[8], data, 32 ); + GET_UINT32( X[9], data, 36 ); + GET_UINT32( X[10], data, 40 ); + GET_UINT32( X[11], data, 44 ); + GET_UINT32( X[12], data, 48 ); + GET_UINT32( X[13], data, 52 ); + GET_UINT32( X[14], data, 56 ); + GET_UINT32( X[15], data, 60 ); + +#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) + +#define P(a,b,c,d,k,s,t) \ +{ \ + a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ +} + + A = ctx->state[0]; + B = ctx->state[1]; + C = ctx->state[2]; + D = ctx->state[3]; + +#define F(x,y,z) (z ^ (x & (y ^ z))) + + P( A, B, C, D, 0, 7, 0xD76AA478 ); + P( D, A, B, C, 1, 12, 0xE8C7B756 ); + P( C, D, A, B, 2, 17, 0x242070DB ); + P( B, C, D, A, 3, 22, 0xC1BDCEEE ); + P( A, B, C, D, 4, 7, 0xF57C0FAF ); + P( D, A, B, C, 5, 12, 0x4787C62A ); + P( C, D, A, B, 6, 17, 0xA8304613 ); + P( B, C, D, A, 7, 22, 0xFD469501 ); + P( A, B, C, D, 8, 7, 0x698098D8 ); + P( D, A, B, C, 9, 12, 0x8B44F7AF ); + P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); + P( B, C, D, A, 11, 22, 0x895CD7BE ); + P( A, B, C, D, 12, 7, 0x6B901122 ); + P( D, A, B, C, 13, 12, 0xFD987193 ); + P( C, D, A, B, 14, 17, 0xA679438E ); + P( B, C, D, A, 15, 22, 0x49B40821 ); + +#undef F + +#define F(x,y,z) (y ^ (z & (x ^ y))) + + P( A, B, C, D, 1, 5, 0xF61E2562 ); + P( D, A, B, C, 6, 9, 0xC040B340 ); + P( C, D, A, B, 11, 14, 0x265E5A51 ); + P( B, C, D, A, 0, 20, 0xE9B6C7AA ); + P( A, B, C, D, 5, 5, 0xD62F105D ); + P( D, A, B, C, 10, 9, 0x02441453 ); + P( C, D, A, B, 15, 14, 0xD8A1E681 ); + P( B, C, D, A, 4, 20, 0xE7D3FBC8 ); + P( A, B, C, D, 9, 5, 0x21E1CDE6 ); + P( D, A, B, C, 14, 9, 0xC33707D6 ); + P( C, D, A, B, 3, 14, 0xF4D50D87 ); + P( B, C, D, A, 8, 20, 0x455A14ED ); + P( A, B, C, D, 13, 5, 0xA9E3E905 ); + P( D, A, B, C, 2, 9, 0xFCEFA3F8 ); + P( C, D, A, B, 7, 14, 0x676F02D9 ); + P( B, C, D, A, 12, 20, 0x8D2A4C8A ); + +#undef F + +#define F(x,y,z) (x ^ y ^ z) + + P( A, B, C, D, 5, 4, 0xFFFA3942 ); + P( D, A, B, C, 8, 11, 0x8771F681 ); + P( C, D, A, B, 11, 16, 0x6D9D6122 ); + P( B, C, D, A, 14, 23, 0xFDE5380C ); + P( A, B, C, D, 1, 4, 0xA4BEEA44 ); + P( D, A, B, C, 4, 11, 0x4BDECFA9 ); + P( C, D, A, B, 7, 16, 0xF6BB4B60 ); + P( B, C, D, A, 10, 23, 0xBEBFBC70 ); + P( A, B, C, D, 13, 4, 0x289B7EC6 ); + P( D, A, B, C, 0, 11, 0xEAA127FA ); + P( C, D, A, B, 3, 16, 0xD4EF3085 ); + P( B, C, D, A, 6, 23, 0x04881D05 ); + P( A, B, C, D, 9, 4, 0xD9D4D039 ); + P( D, A, B, C, 12, 11, 0xE6DB99E5 ); + P( C, D, A, B, 15, 16, 0x1FA27CF8 ); + P( B, C, D, A, 2, 23, 0xC4AC5665 ); + +#undef F + +#define F(x,y,z) (y ^ (x | ~z)) + + P( A, B, C, D, 0, 6, 0xF4292244 ); + P( D, A, B, C, 7, 10, 0x432AFF97 ); + P( C, D, A, B, 14, 15, 0xAB9423A7 ); + P( B, C, D, A, 5, 21, 0xFC93A039 ); + P( A, B, C, D, 12, 6, 0x655B59C3 ); + P( D, A, B, C, 3, 10, 0x8F0CCC92 ); + P( C, D, A, B, 10, 15, 0xFFEFF47D ); + P( B, C, D, A, 1, 21, 0x85845DD1 ); + P( A, B, C, D, 8, 6, 0x6FA87E4F ); + P( D, A, B, C, 15, 10, 0xFE2CE6E0 ); + P( C, D, A, B, 6, 15, 0xA3014314 ); + P( B, C, D, A, 13, 21, 0x4E0811A1 ); + P( A, B, C, D, 4, 6, 0xF7537E82 ); + P( D, A, B, C, 11, 10, 0xBD3AF235 ); + P( C, D, A, B, 2, 15, 0x2AD7D2BB ); + P( B, C, D, A, 9, 21, 0xEB86D391 ); + +#undef F + + ctx->state[0] += A; + ctx->state[1] += B; + ctx->state[2] += C; + ctx->state[3] += D; +} + +void md5_update( md5_context *ctx, uint8 *input, uint32 length ) +{ + uint32 left, fill; + + if( ! length ) return; + + left = ctx->total[0] & 0x3F; + fill = 64 - left; + + ctx->total[0] += length; + ctx->total[0] &= 0xFFFFFFFF; + + if( ctx->total[0] < length ) + ctx->total[1]++; + + if( left && length >= fill ) + { + memcpy( (void *) (ctx->buffer + left), + (void *) input, fill ); + md5_process( ctx, ctx->buffer ); + length -= fill; + input += fill; + left = 0; + } + + while( length >= 64 ) + { + md5_process( ctx, input ); + length -= 64; + input += 64; + } + + if( length ) + { + memcpy( (void *) (ctx->buffer + left), + (void *) input, length ); + } +} + +static uint8 md5_padding[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +void md5_finish( md5_context *ctx, uint8 digest[16] ) +{ + uint32 last, padn; + uint32 high, low; + uint8 msglen[8]; + + high = ( ctx->total[0] >> 29 ) + | ( ctx->total[1] << 3 ); + low = ( ctx->total[0] << 3 ); + + PUT_UINT32( low, msglen, 0 ); + PUT_UINT32( high, msglen, 4 ); + + last = ctx->total[0] & 0x3F; + padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); + + md5_update( ctx, md5_padding, padn ); + md5_update( ctx, msglen, 8 ); + + PUT_UINT32( ctx->state[0], digest, 0 ); + PUT_UINT32( ctx->state[1], digest, 4 ); + PUT_UINT32( ctx->state[2], digest, 8 ); + PUT_UINT32( ctx->state[3], digest, 12 ); +} + +#ifdef TEST + +#include +#include + +/* + * those are the standard RFC 1321 test vectors + */ + +static char *msg[] = +{ + "", + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "12345678901234567890123456789012345678901234567890123456789012" \ + "345678901234567890" +}; + +static char *val[] = +{ + "d41d8cd98f00b204e9800998ecf8427e", + "0cc175b9c0f1b6a831c399e269772661", + "900150983cd24fb0d6963f7d28e17f72", + "f96b697d7cb7938d525a2f31aaf161d0", + "c3fcd3d76192e4007dfb496cca67e13b", + "d174ab98d277d9f5a5611c2c9f419d9f", + "57edf4a22be3c955ac49da2e2107b67a" +}; + +int main( int argc, char *argv[] ) +{ + FILE *f; + int i, j; + char output[33]; + md5_context ctx; + unsigned char buf[1000]; + unsigned char md5sum[16]; + + if( argc < 2 ) + { + printf( "\n MD5 Validation Tests:\n\n" ); + + for( i = 0; i < 7; i++ ) + { + printf( " Test %d ", i + 1 ); + + md5_starts( &ctx ); + md5_update( &ctx, (uint8 *) msg[i], strlen( msg[i] ) ); + md5_finish( &ctx, md5sum ); + + for( j = 0; j < 16; j++ ) + { + sprintf( output + j * 2, "%02x", md5sum[j] ); + } + + if( memcmp( output, val[i], 32 ) ) + { + printf( "failed!\n" ); + return( 1 ); + } + + printf( "passed.\n" ); + } + + printf( "\n" ); + } + else + { + if( ! ( f = fopen( argv[1], "rb" ) ) ) + { + perror( "fopen" ); + return( 1 ); + } + + md5_starts( &ctx ); + + while( ( i = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) + { + md5_update( &ctx, buf, i ); + } + + md5_finish( &ctx, md5sum ); + + for( j = 0; j < 16; j++ ) + { + printf( "%02x", md5sum[j] ); + } + + printf( " %s\n", argv[1] ); + } + + return( 0 ); +} + +#endif + +/* this was added for bip */ + +#include + +/* +unsigned char *md5dup(unsigned char *data, size_t len) +{ + md5_context ctx; + unsigned char *md5 = malloc(16); + md5_starts(&ctx); + md5_update(&ctx, data, len); + md5_finish(&ctx, md5); + return md5; +} + +unsigned char *strmd5(char *str) +{ + size_t length; + if (!str) + return NULL; + length = strlen(str); + if (length == 0) + return NULL; + return md5dup((unsigned char*)str, length); +} +*/ + +unsigned char *chash_double(char *str, unsigned int seed) +{ + size_t length; + md5_context ctx; + unsigned char *ptr; + unsigned char *md5; + + length = strlen(str); + length += 4; + ptr = malloc(length); + ptr[0] = seed >> 24 & 0xff; + ptr[1] = seed >> 16 & 0xff; + ptr[2] = seed >> 8 & 0xff; + ptr[3] = seed & 0xff; + memcpy(ptr + 4, str, length - 4); + + md5 = malloc(16 + 4); + memcpy(md5, ptr, 4); + + md5_starts(&ctx); + md5_update(&ctx, ptr, length); + md5_finish(&ctx, md5 + 4); + + md5_starts(&ctx); + md5_update(&ctx, md5, 20); + md5_finish(&ctx, md5 + 4); + return md5; +} + +int chash_cmp(char *try, unsigned char *pass, unsigned int seed) +{ + int i; + unsigned char *try_hash; + + try_hash = chash_double(try, seed); + for (i = 0; i < 20; i++) { + if (try_hash[i] != pass[i]) { + free(try_hash); + return 1; /* like strcmp 0 means == */ + } + } + free(try_hash); + return 0; +} + diff --git a/src/md5.h b/src/md5.h new file mode 100644 index 0000000..6ca7c8a --- /dev/null +++ b/src/md5.h @@ -0,0 +1,23 @@ +#ifndef _MD5_H +#define _MD5_H + +#ifndef uint8 +#define uint8 unsigned char +#endif + +#ifndef uint32 +#define uint32 unsigned long int +#endif + +typedef struct +{ + uint32 total[2]; + uint32 state[4]; + uint8 buffer[64]; +} +md5_context; + +int chash_cmp(char *try, unsigned char *pass, + unsigned int seed); +unsigned char *chash_double(char *str, unsigned int seed); +#endif /* md5.h */ diff --git a/src/stamp-h.in b/src/stamp-h.in new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/src/stamp-h.in @@ -0,0 +1 @@ +timestamp diff --git a/src/tuple.h b/src/tuple.h new file mode 100644 index 0000000..76fc889 --- /dev/null +++ b/src/tuple.h @@ -0,0 +1,27 @@ +/* + * $Id: conf.h,v 1.5 2005/04/17 15:20:32 nohar Exp $ + * + * This file is part of the bip project + * Copyright (C) 2004 Arnaud Cornet and Loïc Gomez + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef TUPLE_H +#define TUPLE_H + +#define TUPLE_STR 0 +#define TUPLE_INT 1 +#define TUPLE_LIST 2 + +struct tuple { + int type; + void *pdata; + int ndata; + int tuple_type; +}; +#endif diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..b015c59 --- /dev/null +++ b/src/util.c @@ -0,0 +1,631 @@ +/* + * $Id: util.c,v 1.60 2005/04/12 19:34:35 nohar Exp $ + * + * This file is part of the bip project + * Copyright (C) 2004 Arnaud Cornet and Loïc Gomez + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "config.h" +#include "util.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern int conf_log_level; +extern int errno; + +/* + * ::= { | | } + * ::= '-' | '[' | ']' | '\' | '`' | '^' | '{' | '}' + */ +int is_valid_nick(char *str) +{ + char *tmp; + if (!str || !isalpha(*str)) + return 0; + + tmp = str; + while (*tmp != '\0' && (isalnum(*tmp) || *tmp == '-' || *tmp == '[' || + *tmp == ']' || *tmp == '\\' || *tmp == '`' || + *tmp == '^' || *tmp == '{' || *tmp == '}' || + *tmp == '|')) + tmp++; + return (*tmp == '\0'); +} + +int is_valid_username(char *str) +{ + char *tmp; + if (!str || *str == '\0' || *str == ' ' || *str == '\n' || *str == '\r') + return 0; + + tmp = str; + while (*tmp != '\0' && *tmp != ' ' && *tmp != '\0' && *tmp != '\r' && + *tmp != '\n') + tmp++; + return (*tmp == '\0'); +} + +char *timestamp(void) +{ + static char ts[20]; + time_t tv; + struct tm *tm; + + time(&tv); + tm = localtime(&tv); + + snprintf(ts, 20, "%02d-%02d-%04d %02d:%02d:%02d", tm->tm_mday, + tm->tm_mon + 1, tm->tm_year + 1900, tm->tm_hour, + tm->tm_min, tm->tm_sec); + return ts; +} + +extern FILE *conf_global_log_file; + +void _mylog(int level, char *fmt, va_list ap) +{ + char *prefix; + + if (level > conf_log_level) + return; + + switch (level) { + case LOG_FATAL: + prefix = "FATAL: "; + break; + case LOG_DEBUGVERB: + prefix = "DEBUG: "; + break; + case LOG_DEBUG: + prefix = "DEBUG: "; + break; + case LOG_ERROR: + prefix = "ERROR: "; + break; + case LOG_WARN: + prefix = "WARNING: "; + break; + case LOG_INFO: + prefix = "INFO: "; + break; + default: + prefix = ""; + break; + } + + fprintf(conf_global_log_file, "%s %s", timestamp(), prefix); + vfprintf(conf_global_log_file, fmt, ap); + fprintf(conf_global_log_file, "\n"); +#ifdef DEBUG + fflush(conf_global_log_file); +#endif +} + +void mylog(int level, char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + _mylog(level, fmt, ap); + va_end(ap); +} + +extern char *conf_pid_file; +void fatal(char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + _mylog(LOG_FATAL, fmt, ap); + + va_end(ap); + exit(200); +} + +/* + * list handling functions + */ + +struct list_item { + struct list_item *next; + struct list_item *prev; + void *ptr; +}; + +int list_ptr_cmp(void *a, void *b) +{ + if (a == b) + return 0; + return -1; +} + +void list_init(list_t *l, int (*cmp)(void *, void *)) +{ + l->first = NULL; + l->last = NULL; + l->cmp = cmp; +} + +list_t *list_new(int (*cmp)(void *, void *)) +{ + list_t *l; + l = malloc(sizeof(list_t)); + if (!l) + fatal("malloc"); + list_init(l, cmp); + return l; +} + +static struct list_item *list_item(void *ptr) +{ + struct list_item *l; + l = malloc(sizeof(struct list_item)); + if (!l) + fatal("malloc"); + l->ptr = ptr; + l->next = NULL; + l->prev = NULL; + return l; +} + +void list_add_first(list_t *list, void *ptr) +{ + struct list_item *li; + li = list_item(ptr); + if (!list->first) { + list->first = list->last = li; + return; + } + li->next = list->first; + list->first = li; + li->next->prev = li; +} + +void list_add_first_uniq(list_t *list, void *ptr) +{ + if (list_get(list, ptr)) + return; + list_add_first(list, ptr); +} + +void list_add_last(list_t *list, void *ptr) +{ + struct list_item *li; + li = list_item(ptr); + if (!list->first) { + list->first = list->last = li; + return; + } + li->prev = list->last; + list->last = li; + li->prev->next = li; +} + +void *list_get_first(list_t *list) +{ + if (!list->first) + return NULL; + return list->first->ptr; +} + +void *list_get_last(list_t *list) +{ + if (!list->last) + return NULL; + return list->last->ptr; +} + +void *list_remove_first(list_t *list) +{ + struct list_item *l; + void *ptr = list_get_first(list); + + if (!ptr) + return NULL; + l = list->first; + list->first = list->first->next; + if (list->first == NULL) + list->last = NULL; + free(l); + return ptr; +} + +void *list_remove_last(list_t *list) +{ + struct list_item *l; + void *ptr = list_get_last(list); + + if (!ptr) + return NULL; + l = list->last; + list->last = list->last->prev; + if (list->last == NULL) + list->first = NULL; + free(l); + return ptr; +} + +/* +static void *list_remove_item(list_t *l, struct list_item *li) +{ + void *ret = li->ptr; + if (!li->prev) { + if (l->first != li) + fatal("list_remove_item"); + l->first = li->next; + } else + li->prev->next = li->next; + + if (!li->next) { + if (l->last != li) + fatal("list_remove_item"); + l->last = li->prev; + } else + li->next->prev = li->prev; + free(li); + return ret; +} +*/ + +void *list_remove_if_exists(list_t *list, void *ptr) +{ + list_iterator_t li; + int debug = 0; + void *ret; + + if (!list->cmp) + fatal("list_remove: list does not have a cmp function\n"); + + for (list_it_init(list, &li); list_it_item(&li); list_it_next(&li)) { + if (list->cmp(list_it_item(&li), ptr) == 0) { + if (debug == 1) + fatal("%x appears twice in list\n", ptr); + ret = list_it_remove(&li); + debug = 1; + } + } + if (debug) + return ret; + return NULL; +} + +void *list_remove(list_t *list, void *ptr) +{ + void *ret; + if (!(ret = list_remove_if_exists(list, ptr))) + fatal("list_remove: item not found"); + return ret; +} + +void *list_get(list_t *list, void *ptr) +{ + struct list_item *it; + + if (!list->cmp) + fatal("list_get: list does not have a cmp function\n"); + + for (it = list->first; it; it = it->next) { + if (list->cmp(it->ptr, ptr) == 0) + return it->ptr; + } + return NULL; +} + +int list_is_empty(list_t *l) +{ + return (l->first ? 0 : 1); +} + +void list_it_init(list_t *list, list_iterator_t *ti) +{ + ti->list = list; + ti->cur = list->first; +} + +void list_it_next(list_iterator_t *ti) +{ + if (ti->cur) + ti->cur = ti->cur->next; +} + +void *list_it_item(list_iterator_t *ti) +{ + if (!ti->cur) + return NULL; + return ti->cur->ptr; +} + +void *list_it_remove(list_iterator_t *li) +{ + if (!li->cur) + return NULL; + + if (li->cur->prev) + li->cur->prev->next = li->cur->next; + else + li->list->first = li->cur->next; + + if (li->cur->next) + li->cur->next->prev = li->cur->prev; + else + li->list->last = li->cur->prev; + + void *ptr = li->cur->ptr; + struct list_item *item = li->cur; + li->cur = li->cur->next; + free(item); + return ptr; +} + +void list_free_force(list_t *t) +{ + free(t); +} + +void list_free(list_t *t) +{ + if (t->first != NULL) + fprintf(stderr, "Warning, freeing non empty list\n"); + free(t); +} + +void list_append(list_t *src, list_t *dest) +{ + list_iterator_t it; + + for (list_it_init(src, &it); list_it_item(&it); list_it_next(&it)) + list_add_last(dest, list_it_item(&it)); +} + +/* + * Hash stuff + */ + +struct hash_item { + char *key; + void *item; +}; + +static int hash_item_nocase_cmp(struct hash_item *a, char *b) +{ + return strcasecmp(a->key, b); +} + +static int hash_item_cmp(struct hash_item *a, char *b) +{ + return strcmp(a->key, b); +} + +void hash_init(hash_t *h, int options) +{ + int i; + memset(h, 0, sizeof(hash_t)); + for (i = 0; i < 256; i++) { + switch (options) { + case HASH_NOCASE: + list_init(&h->lists[i], + (int (*)(void*,void*))hash_item_nocase_cmp); + break; + case HASH_DEFAULT: + list_init(&h->lists[i], + (int (*)(void*,void*))hash_item_cmp); + break; + default: + fatal("wrong hash option %d", options); + } + } +} + +void hash_clean(hash_t *h) +{ + int i; + for (i = 0; i < 256; i++) { + while (list_remove_first(&h->lists[i])) + ; + } +} + +void hash_free(hash_t *h) +{ + hash_clean(h); + free(h); +} + +hash_t *hash_new(int options) +{ + hash_t *h; + h = malloc(sizeof(hash_t)); + if (!h) + fatal("malloc"); + hash_init(h, options); + return h; +} + +static unsigned char hash_func(char *pkey) +{ + unsigned char i = 0; + while (*pkey) + i += (unsigned char)toupper(*pkey++); + return i; +} + +void hash_insert(hash_t *hash, char *key, void *ptr) +{ + struct hash_item *it; + + if (hash_get(hash, key)) + fatal("Element with key %s already in hash %x\n", key, hash); + + it = malloc(sizeof(struct hash_item)); + if (!it) + fatal("malloc"); + it->key = strdup(key); + it->item = ptr; + list_add_first(&hash->lists[hash_func(key)], it); +} + +void *hash_get(hash_t *hash, char *key) +{ + struct hash_item *hi; + list_t *list = &hash->lists[hash_func(key)]; + hi = list_get(list, key); + if (!hi) + return NULL; + return hi->item; +} + +void *hash_remove_if_exists(hash_t *hash, char *key) +{ + if (hash_get(hash, key) == NULL) + return NULL; + return hash_remove(hash, key); +} + +void *hash_remove(hash_t *hash, char *key) +{ + struct hash_item *it; + void *ptr; + it = (struct hash_item *)list_remove(&hash->lists[hash_func(key)], key); + if (!it) + return NULL; + ptr = it->item; + free(it->key); + free(it); + return ptr; +} + +void hash_it_init(hash_t *h, hash_iterator_t *hi) +{ + memset(hi, 0, sizeof(hash_iterator_t)); + hi->hash = h; + + while (list_is_empty(&h->lists[hi->list]) && hi->list < 256) + hi->list++; + if (hi->list < 256) + hi->cur = h->lists[hi->list].first; + else + hi->cur = NULL; +} + +void hash_it_next(hash_iterator_t *hi) +{ + hash_t *hash = hi->hash; + + hi->cur = hi->cur->next; + while (!hi->cur) { + hi->list++; + if (hi->list == 256) { + hi->cur = NULL; + return; + } + hi->cur = hash->lists[hi->list].first; + } +} + +void *hash_it_item(hash_iterator_t *h) +{ + if (!h->cur) + return NULL; + struct hash_item *hi = h->cur->ptr; + return hi->item; +} + +char *hash_it_key(hash_iterator_t *h) +{ + if (!h->cur) + return NULL; + struct hash_item *hi = h->cur->ptr; + return hi->key; +} + +char *strmaydup(char *s) +{ + if (!s) + return s; + return strdup(s); + +} + +/* returns 1 on error */ +int ident_spoof(char *user) +{ + char *h; + char buf[1024]; + mode_t ou; + FILE *of; + int cnt = 0; + + /* get home dir or return an error */ + h = getenv("HOME"); + if (h == NULL) + return 1; + + /* first we set umask correctly */ + ou = umask(0022); + + snprintf(buf, 1024, "%s/.ispoof", h); + of = fopen(buf, "w"); + if (of) { + fprintf(of, "%s\n", user); + fclose(of); + cnt++; + } + snprintf(buf, 1024, "%s/.oidentd.conf", h); + of = fopen(buf, "w"); + if (of) { + fprintf(of, "global { reply \"%s\" }\n", user); + fclose(of); + cnt++; + } + + /* restore old umask */ + umask(ou); + + return (cnt == 2); +} + +/* returns 1 on error */ +int ident_nospoof() +{ + char *h; + char buf[1024]; + int e, cnt; + + /* get home dir or return an error */ + h = getenv("HOME"); + if (h == NULL) + return 1; + + snprintf(buf, 1024, "%s/.ispoof", h); + e = unlink(buf); + cnt = (e == -1 && errno != ENOENT ? 1 : 0); + snprintf(buf, 1024, "%s/.oidentd.conf", h); + e = unlink(buf); + return cnt+(e == -1 && errno != ENOENT ? 1 : 0); +} + +void strucase(char *s) +{ + while (*s) { + *s = toupper(*s); + s++; + } +} + +int ischannel(char p) +{ + return (p == '#' || p == '&' || p == '+' || p == '!'); +} + diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..a512c4c --- /dev/null +++ b/src/util.h @@ -0,0 +1,103 @@ +/* + * $Id: util.h,v 1.35 2005/04/12 19:34:35 nohar Exp $ + * + * This file is part of the bip project + * Copyright (C) 2004 Arnaud Cornet and Loïc Gomez + * + * 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. + * See the file "COPYING" for the exact licensing terms. + */ +#ifndef UTIL_H +#define UTIL_H +#include +#include +#include + +/* Warning: must be in order, 0 = less output */ +#define LOG_FATAL 0 +#define LOG_ERROR 1 +#define LOG_WARN 2 +#define LOG_INFO 3 +#define LOG_DEBUG 4 +#define LOG_STD 4 +#define LOG_DEBUGVERB 5 +#define LOG_DEBUGTOOMUCH 6 + +#define HASH_NOCASE 1 +#define HASH_DEFAULT 0 + +void mylog(int level, char *fmt, ...); +void fatal(char *fmt, ...); +char *timestamp(void); +struct list_item; + +typedef struct list { + struct list_item *first; + struct list_item *last; + int (*cmp)(); +} list_t; + +typedef struct list_iterator { + list_t *list; + struct list_item *cur; +} list_iterator_t; + +/* our hash is also a list */ +typedef struct hash { + list_t lists[256]; +} hash_t; + +typedef struct hash_iterator { + int list; + struct list_item *cur; + hash_t *hash; +} hash_iterator_t; + +void list_init(list_t *list, int (*cmp)(void*,void*)); +int list_ptr_cmp(void *a, void *b); +list_t *list_new(int (*cmp)(void *, void *)); +void *list_remove(list_t *list, void *ptr); +void *list_remove_if_exists(list_t *list, void *ptr); +void *list_get(list_t *list, void *ptr); +void list_add_first(list_t *list, void *ptr); +void list_add_first_uniq(list_t *list, void *ptr); +void list_add_last(list_t *list, void *ptr); +void *list_get_first(list_t *list); +void *list_get_last(list_t *list); +void *list_remove_first(list_t *list); +void *list_remove_last(list_t *list); +void list_it_init(list_t *list, list_iterator_t *ti); +void list_it_next(list_iterator_t *ti); +void *list_it_item(list_iterator_t *ti); +void *list_it_remove(list_iterator_t *li); +void list_free(list_t *t); +void list_free_force(list_t *t); +void list_copy(list_t *src, list_t *dest); +void list_append(list_t *src, list_t *dest); +int list_is_empty(list_t *l); + +void hash_init(hash_t *h, int); +void hash_free(hash_t *h); +void hash_clean(hash_t *h); +hash_t *hash_new(int options); +void hash_insert(hash_t *hash, char *key, void *ptr); +void *hash_get(hash_t *, char *key); +void *hash_remove(hash_t *hash, char *key); +void *hash_remove_if_exists(hash_t *hash, char *key); +void hash_it_init(hash_t *hash, hash_iterator_t *i); +void hash_it_next(hash_iterator_t *hi); +void *hash_it_item(hash_iterator_t *h); +char *hash_it_key(hash_iterator_t *h); + +int is_valid_nick(char *str); +int is_valid_username(char *str); +char *strmaydup(char *s); + +int ident_spoof(char *user); +int ident_nospoof(); +void strucase(char *s); +int ischannel(char p); +#endif diff --git a/stamp-h.in b/stamp-h.in new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/stamp-h.in @@ -0,0 +1 @@ +timestamp