--- /dev/null
+Courier is written by:
+
+Sam Varshavchik <mrsam@courier-mta.com>
+Double Precision, Inc.
+402 Main Street
+Suite 100-241
+Metuchen, NJ 08840
+
+authldap based upon work by Luc Saillard <luc.saillard@alcove.fr>
+
+MySQL support based on a patch by:
+Laszlo KAISER <titanic@telnet.hu>
+
+The HTML layout of the webmail server based on on a design by cniconsulting.com
+
+PostgreSQL support based on a patch by:
+Vittorio Ballestra <vittorio.ballestra@infogestnet.it>
--- /dev/null
+This software is released under the GPL, version 2 (see COPYING.GPL).
+
--- /dev/null
+ 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.
+\f
+ 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.)
+\f
+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.
+\f
+ 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.
+\f
+ 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
+\f
+ 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 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.
+
+ <signature of Ty Coon>, 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.
--- /dev/null
+0.59.3
+
+2007-04-22 Bill Shupp <hostmaster@shupp.org>
+
+ * Implement CRAM authentication in the vchpw module.
+
+2007-04-22 Mr. Sam <mrsam@courier-mta.com>
+
+ * courier-authlib.spec.in: spec files requires redhat-rpm-config
+
+2007-04-15 Mr. Sam <mrsam@courier-mta.com>
+
+ * man pages: work around for some bugs in Docbook XML stylesheets.
+
+2007-04-13 Mr. Sam <mrsam@courier-mta.com>
+
+ * authpipe.c (auth_pipe_pre): Fix leak when authpipe module is
+ enabled, but the actual authpipe script/external prog is not
+ installed.
+
+ * authpipe.c (auth_pipe_chgpwd): Pedantic resource cleanup,
+ after fork() fails.
+
+ * userdb/userdb.c (userdb): Pedantic resource cleanup, after
+ a malloc failure.
+
+ * userdb/userdb2.c (userdbshadow): Ditto.
+
+0.59.2
+
+2007-04-05 Mr. Sam <mrsam@courier-mta.com>
+
+ * Update man pages and documentation to Docbook XML V4.4
+
+2007-02-25 Mr. Sam <mrsam@courier-mta.com>
+
+ * More configure script cleanup
+
+2007-02-25 Kurt Roeckx <kurt@roeckx.be>
+
+ * Clean up configure scripts
+
+2007-02-09 Juraj Lutter <otis@wilbury.sk>
+
+ * authmysqlrc: Implement SSL-encrypted MySQL connections
+
+2007-01-20 Mr. Sam <mrsam@courier-mta.com>
+
+ * authldaplib.c: Fix pedantic C code.
+
+0.59.1
+
+2007-01-16 Mr. Sam <mrsam@courier-mta.com>
+
+ * authldaplib.c (l_simple_bind_s): Fix anon binds.
+
+0.59
+
+2006-12-30 Lars Timmann <Lars.Timmann@mcs.de>
+
+ * Makefile.am: Fixes for Solaris's linker.
+
+2006-10-28 Mr. Sam <mrsam@courier-mta.com>
+
+ * Ported code to gcc 4.1.1
+
+ * Ported authldap to openldap 2.3.27
+
+2006-09-17 Chris Petersen <rpm@forevermore.net>
+
+ - Make the spec a little prettier
+ - Replace BuildPreReq with BuildRequires
+ - Remove period from summaries (rpmlint)
+ - Fix release tag to use %{?dist} macro if it's present
+ - Change distro-detection to use "rh" and "fc" for version detection, and add support for mandriva
+
+2006-06-01 kabe@sra-tohoku.co.jp
+
+ * authldaplib.c (auth_ldap_enumerate): Fix LDAP account enumeration
+
+2006-05-28 Mr. Sam <mrsam@courier-mta.com>
+
+ * all: Fix many compiler warnings.
+
+2006-03-25 Rui Lopes <rui@ruilopes.com>
+
+ * userdb/makeuserdb.in: Added the -f option to makeuserdb
+
+2006-02-23 Mr. Sam <mrsam@courier-mta.com>
+
+ * authldaplib.c (authldap_read_config): Fix up an error message.
+
+2006-01-30 Mr. Sam <mrsam@courier-mta.com>
+
+ * authldaplib.c: Try to recover when the LDAP server closes the
+ persistent socket, for inactivity.
+
+2006-01-21 Mr. Sam <mrsam@courier-mta.com>
+
+ * configure.in: Fix libtool 1.9 breakage.
+
+ * Makefile.am: Ditto
+
+ * courier-authlib spec file (BuildRequires): Demand /usr/include/ltdl.h
+
+ * authdaemonlib.c (s_connect): Fix compiler warning.
+
+ * authdaemond.c (start): Ditto.
+
+ * authsaslclientcram.c (authsaslclient_cram): Ditto.
+
+ * libhmac/hmac.c (dohashkey): Ditto.
+
+0.58
+
+2005-12-08 Mr. Sam <mrsam@courier-mta.com>
+
+ * authpam.c (dopam): Re-enable pam_acct_mgmt hook.
+
+2005-11-16 Mr. Sam <mrsam@courier-mta.com>
+
+ * preauthshadow.c: Add support for shadow password expiration --
+ based on Krzysztof Oledzki <ole@ans.pl>'s patch.
+
+2005-10-04 Brian Candler <B.Candler@pobox.com>
+
+ * authdaemonrc.in (LOGGEROPTS): Add a section for LDAP environment
+ variable options.
+
+2005-09-30 Mr. Sam <mrsam@courier-mta.com>
+
+ * authdaemonlib.c (opensock): Configurable daemon socket timeout,
+ based on a patch by Rodrigo Salinas <rodrigo@facea.uchile.cl>.
+
+2005-09-30: Michael Richard <michael.richard@cesart.com>
+
+ * authldaplib: Replace LDAP_SERVER and LDAP_PORT settings with
+ LDAP_URI, which obsoletes LDAP_TLS.
+
+2005-09-18 Mr. Sam <mrsam@courier-mta.com>
+
+ * authldaplib.c (auth_ldap_do2): Fix LDAP error checking.
+
+2005-09-03 Mr. Sam <mrsam@courier-mta.com>
+
+ * authinfo.c (getmgid): Fix misleading error message.
+
+2005-08-10 "Johnny C. Lam" <jlam@NetBSD.org>
+
+ * authpipelib.c: Include sys/time.h
+
+0.57
+
+2005-07-16 Mr. Sam <mrsam@courier-mta.com>
+
+ * configure.in: Update to automake 1.9, autoconf 2.59, libtool 1.5.6.
+
+2005-07-12 Mr. Sam <mrsam@courier-mta.com>
+
+ * authlib: create the authtest and authpasswd manual pages.
+
+2005-07-09 Mr. Sam <mrsam@courier-mta.com>
+
+ * authldaplib.c (auth_ldap_do3): Fix call of authcryptpasswd().
+
+ * authpgsqllib.c (auth_pgsql_setpass): Ditto.
+
+ * authmysqllib.c (auth_mysql_setpass): Ditto.
+
+ * cryptpassword.c (authcryptpasswd): Fix handling of encryption hints.
+
+ * checkpassword.c (do_authcheckpassword): Ignore {CRYPT} prefix on
+ crypted passwords.
+
+ * checkpasswordsha1.c (authcheckpasswordsha1): Fix {SHA256} passwords.
+
+ * authmysqllib.c (auth_mysql_setpass): Fix a memory leak.
+
+2005-07-06 Willi Mann <willi@wm1.at>
+
+ * authdaemond.c: Strip full name/gecos field after the first comma.
+
+2005-07-04 Brian Candler <B.Candler@pobox.com>
+
+ * liblog/logger.c: Fix wrong args to setuidgid().
+
+ * README_authlib.sgml: Document updated authpipe protocol.
+
+ * authdaemond: Pass LOGGEROPTS option to authdaemond.
+
+2005-07-02 Mr. Sam <mrsam@courier-mta.com>
+
+ * liblog/logger.c: Added -droproot option to courierlogger.
+
+ * liblock/lockdaemon.c: Try to recover if upgraded daemon process runs
+ under a different uid.
+
+2005-07-01 Brian Candler <B.Candler@pobox.com>
+
+ * Changed -uid and -gid options to -user and -group for consistency
+ with couriertcpd. Change them to affect courierlogger itself,
+ after it has spawned any child.
+
+ * Optional default domain for authentication requests.
+
+2005-07-02 Mr. Sam <mrsam@courier-mta.com>
+
+ * Makefile.am: Refactor the linking process to make it more portable.
+
+2005-06-30 Brian Candler <B.Candler@pobox.com>
+
+ * authdaemon.c (auth_generic): Silly bug in auth_generic().
+
+ * authpipe: more fixes to the authpipe module.
+
+2005-05-14 Christian Loitsch <christian@fgecko.com>
+
+ * authpipe: various fixes to the authpipe module.
+
+0.56
+
+2005-05-08 Mr. Sam <mrsam@courier-mta.com>
+
+ * courier-authlib.sysvinit: Remove lockfile after stop.
+
+2005-04-07 Mr. Sam <mrsam@courier-mta.com>
+
+ * authpipe.c (auth_pipe_pre): Fix zombies created by the authpipe
+ module.
+
+2005-03-20 Christian Loitsch <courier-imap@abc.fgecko.com>
+
+ * New authpipe authentication module.
+
+2005-03-20 Brian Candler <B.Candler@pobox.com>
+
+ * Fix the error code when an empty password is provided.
+
+ * authldap.schema: Add mailhost to the recommended LDAP schema.
+
+0.55
+
+2005-03-02 Mr. Sam <mrsam@courier-mta.com>
+
+ * authsystem.passwd.in: Explicitly set LC_ALL to en_US
+
+2005-02-20 Mr. Sam <mrsam@courier-mta.com>
+
+ * SASL: Added CRAM-SHA256 authentication method (experimental).
+
+2005-02-19 Mr. Sam <mrsam@courier-mta.com>
+
+ * courierauthdebug.h: Macro dprintf conflicts with new glibc.
+
+0.54
+
+2005-01-31 Mr. Sam <mrsam@courier-mta.com>
+
+ * authmigrate.in (rc): Fix - userdb file does not have to have a
+ leading ##VERSION
+
+2005-01-19 Brian Candler <B.Candler@pobox.com>
+
+ * userdb/makeuserdb.in: Report dangling symlinks.
+
+0.53
+
+2005-01-11 Mr. Sam <mrsam@courier-mta.com>
+
+ * configure.in: Typo fix.
+
+2005-01-05 Mr. Sam <mrsam@courier-mta.com>
+
+ * Makefile.am (uninstall-hook): pw2userdb was not being installed.
+
+0.52
+
+2005-01-01 Mr. Sam <mrsam@courier-mta.com>
+
+ * configure.in: Fix gdbm/bdb check. Try to autoprobe for Solaris
+ linker.
+
+2004-12-05 Mr. Sam <mrsam@courier-mta.com>
+
+ * configure.in: Fix courierauthconfig --cppflags, new option to the
+ configure script: --without-stdheaderdir
+
+2004-12-03 Mr. Sam <mrsam@courier-mta.com>
+
+ * courierauthconfig: --version prints package version.
+ --version=V print "yes" if package version is at least V.
+
+2004-12-01 Mr. Sam <mrsam@courier-mta.com>
+
+ * liblog/logger.c: Added -uid and -gid options to courierlogger.
+
+2004-11-29 Brian Candler <B.Candler@pobox.com>
+
+ * authldaplib.c: Use persistent connections for authenticated binds
+ when using LDAPv3. Use the LDAP_OPT_NETWORK_TIMEOUT setting,
+ initialized from the configuration file, if provided (OpenLDAP).
+ If using authenticated binds, a password change is done under the
+ user's credentials, instead of the admin's.
+
+2004-11-24 Brian Candler <B.Candler@pobox.com>
+
+ * README.authdebug.html: document temporary failure messages.
+
+2004-11-24 Mr. Sam <mrsam@courier-mta.com>
+
+ * courier-authlib.spec.in: Move the userdb scripts in sbindir from
+ main package to the userdb subpackage.
+
+2004-11-24 Brian Candler <B.Candler@pobox.com>
+
+ * authuserdb.c: Fix error handling in userdb CRAM.
+
+ * userdb-test-cram-md5: Helper script for verifying C/R authentication.
+
+2004-11-20 Brian Candler <B.Candler@pobox.com>
+
+ * Additional debug messages.
+
+2004-11-13 Brian Candler <B.Candler@pobox.com>
+
+ * mysql/pgsql fixes; other misc fixes
+
+2004-11-16 Mr. Sam <mrsam@courier-mta.com>
+
+ * configure.in: Fix mysql/pgslq autodetection
+
+2004-11-13 Brian Candler <B.Candler@pobox.com>
+
+ * authdaemond: Fix bug in account enumeration function.
+
+ * authdaemond: Return individual account options when enumerating
+ accounts. Affects mysql, ldap, pgsql modules. mysql and pgsql
+ enumeration filter must now return one more column. Added an ldap
+ enumeration filter. New option to authenumerate, -o, includes
+ account options in the output. New option, -s, suppressed accounts
+ that have the disableshared option set.
+
+ * authmysql, authpgsql: Additional debugging.
+
+ * authmysql, authpgsql, authldap: Replaced enumeration function,
+ more efficient memory usage with large accounts.
+
+ * authldap: Suggested account schema has uid and gid optional, because
+ global uid and gids may be set in authldaprc instead.
+
+ * authvchkpw: Fix vpopmail compilation.
+
+2004-11-10 Mr. Sam <mrsam@courier-mta.com>
+
+ * configure.in: Do not disable mysql + pgsql if vchkpw lib was found.
+
+2004-11-09 Brian Candler <B.Candler@pobox.com>
+
+ * authdaemond.c: New DEFAULTOPTIONS setting.
+
+2004-11-04 Mr. Sam <mrsam@courier-mta.com>
+
+ * authdaemonlib.c (s_connect): Wait for connection to authdaemond
+ only if async connect() failed with EINPROGRESS.
+
+2004-11-03 Mr. Sam <mrsam@courier-mta.com>
+
+ * Makefile.am (SUBDIRS): Ok, only build in bdbobj/gdbmobj according
+ to what autoconf finds.
+
+ * authldaplib.c (auth_ldap_do3): Fix LDAP driver.
+
+2004-11-03 Brian Candler <B.Candler@pobox.com>
+
+ * Makefile.am: Fixes.
+
+2004-10-30 Mr. Sam <mrsam@courier-mta.com>
+
+ * authinfo.c: Added mailuid= and mailgid=
+
+2004-10-21 Mr. Sam <mrsam@courier-mta.com>
+
+ * Makefile.am (libcourierauthsaslclient_la_SOURCES): Factored out
+ SASL client support into libcourierauthsaslclient.la
+
+2004-10-21 Brian Candler <B.Candler@pobox.com>
+
+ * Makefile.am: Fixes.
+
+2004-10-16 Mr. Sam <mrsam@courier-mta.com>
+
+ * authldap.schema: Added disableimap, disablepop3, disablewebmail,
+ and sharedgroup.
+
+2004-10-07 Mr. Sam <mrsam@courier-mta.com>
+
+ * authsyschangepwd.c (dochangepwd): Do not reset the environment
+ before exec-ing expect.
+
+2004-10-04 Mr. Sam <mrsam@courier-mta.com>
+
+ * Merged authuserdb with authcram. Fixed CRAM password changes.
+ Do not reset the environment before exec-ing userdb and makeuserdb.
+
+
--- /dev/null
+ Table of Contents
+
+ In this document (see INSTALL.html for the formatted version of this
+ INSTALL file):
+
+ * [1]Requirements
+ * [2]Installation overview
+ * [3]Dependencies
+ * [4]What gets installed
+ * [5]For more information
+ * [6]Starting and stopping the authentication daemon
+ * [7]Building RPMs
+ * [8]Guidelines for using other package managers
+
+Requirements
+
+ See the README file for a general description of this library. The
+ following software should be installed before building the Courier
+ authentication library:
+
+ * A modern version of gcc ([9]http://www.gnu.org/software/gcc/)
+ * The GNU linker ([10]http://www.gnu.org/software/binutils/)
+ * Libtool ([11]http://www.gnu.org/software/libtool/)
+ * GNU make ([12]http://www.gnu.org/software/make/)
+ * The "expect" command. expect is usually included with most systems.
+ Expect can be downloaded from http://expect.nist.gov/ if it's not
+ installed on your system. This utility is used to change system login
+ passwords, by scripting the passwd command. If you do not have expect
+ installed you will not be able to change system login passwords.
+ However non-system authentication modules (LDAP, PostgreSQL, and
+ others) will work.
+
+ Courier-authlib uses Libtool to build shared libraries. Libtool is not
+ strict required, but Libtool should be installed unless a good -- a
+ very-very good -- reason exists not to. If Libtool is not installed, a
+ copy of Libtool in courier-authlib's source will be used. However, this
+ may cause problems later down the road, if either another Libtool-using
+ package is installed later, or if Libtool itself is installed. Bottom
+ line: install Libtool.
+
+ On non-Linux platforms the GNU linker is also required. Courier-authlib's
+ build script uses some GNU linker-specific options. It's possible to
+ manually specify the native linker's equivalent options manually, if they
+ exist. If the native linker does not have the equivalent options, the GNU
+ linker will have to be installed.
+
+ On the other hand, GNU make will be required in almost every case.
+ SYSV-derived make variants (probably) will not work.
+
+ The same line of logic also applies to gcc. So, strictly speaking, only a
+ basic C compiler, GNU make and libtool, are really needed to build
+ courier-authlib. Still, try the following before giving up if problems
+ occur when building this package:
+
+ 1. Install a recent version of the GNU linker
+ 2. Install the current version of Libtool
+ 3. Install the current version of gcc
+
+Installation overview
+
+ The following sequence of commands should be sufficient to install
+ courier-authlib in most cases:
+
+ ./configure [options] [variable=value]*...
+ make
+ make install
+ make install-migrate
+ make install-configure
+
+ NOTE: On the BSD family, GNU make is usually the 'gmake' command. Use
+ the 'gmake' command, instead of 'make'.
+
+ NOTE: It might appear that the configure script is stuck in an infinite
+ loop. This is only an optical illusion. The configure script takes
+ several minutes to complete. The Courier authentication library consists
+ of many small modules, each with its own configuration script; and all
+ configuration scripts are built from the same template. When they are
+ invoked, one at a time, an illusion of an infinite loop appears.
+
+ Courier-authlib is a requirement starting with the following Courier
+ package versions: Courier 0.48, Courier-IMAP 4.0, SqWebMail 5.0. When
+ upgrading from earlier versions of these packages, install the
+ Courier-authlib package first, then upgrade the existing package.
+
+ The 'make install-migrate' command imports the authentication
+ configuration from earlier versions of these packages. 'make
+ install-migrate' is not needed otherwise.
+
+ The 'make install-migrate' command searches all the known default
+ installation directories for Courier, Courier-IMAP, and SqWebMail, and
+ imports the older configuration files. If the older versions of these
+ packages are installed in some unusual, non-standard, directories, the
+ make install-migrate command won't find them. Instead, copy those
+ configuration files (authdaemonrc, authldaprc, authmysqlprc, authpgsqlprc,
+ and userdb) by hand. DO NOT COPY authdaemonrc.dist, authldaprc.dist,
+ authmysqlprc.dist, and authpgsqlprc.dist.
+
+ After finishing 'make install-migrate', the rest of the installation
+ steps, and after upgrading Courier, Courier-IMAP, or SqWebMail to the new
+ versions, to avoid future confusion the old copies of these configuration
+ files (including the .dist files), should be removed from
+ Courier/Courier-IMAP/SqWebMail's configuration directory. They now live in
+ Courier-authlib's configuration directory (/usr/local/etc/authlib, or
+ whatever was specified to the configure script).
+
+ The 'make install-configure' command is required; it installs and updates
+ the configuration files; this command must be executed when installing
+ Courier-authlib for the first time, and when upgrading from an older
+ version.
+
+ Configuration options
+
+ The configure script takes the usual autoconf options: --prefix, --bindir,
+ and the rest of the usual toolchain options. The default installation
+ directories should be sufficient, though.
+
+ DO NOT USE the --disable-static, or --enable-static=no option. Both static
+ and shared library options must be enabled for courier-authlib to build
+ properly (but see "Post-installation cleanup" below).
+
+ --without-stdheaderdir
+
+ The default configuration installs development files in /usr/local/include
+ (see "What gets installed", below). This directory is usually in the
+ compiler's search path for header files. This option must be specified if
+ the compiler does NOT search for header files in /usr/local/include by
+ default.
+
+ This option must also be specified if other configuration options (such as
+ --prefix or --includedir) specify a different installation directory, and
+ the new directory is also not searched by the compiler, by default
+
+ --with-mailuser=userid, --with-mailgroup=groupid
+
+ "userid" is a reserved system username, "groupid" is a reserved system
+ groupname. These two options should be used before installing Courier for
+ the first time. These options are not required before installing
+ Courier-IMAP or SqWebMail.
+
+ These options specify the user/group that will own the configuration
+ files, and the socket that authentication daemon process listens on. This
+ is a key part of Courier's security model.
+
+ These options should not be necessary if upgrading from an earlier version
+ of Courier and/or this authentication library. The default userid and
+ groupid are computed as follows:
+
+ * If an earlier version of the Courier authentication library is already
+ installed in the same directory, the userid and the groupid is the
+ same as the earlier version, otherwise:
+ * If an earlier version of the Courier package is installed (only the
+ Courier package, the Courier-IMAP and SqWebMail packages do not carry
+ this information), the userid and the groupid is the same as the ones
+ used to configure Courier, otherwise:
+ * The userid is the first userid from the following list which exists in
+ the system: courier, daemon, adm, bin, root; and the groupid is the
+ first groupid from the following list which exists in the system:
+ courier, daemon, adm, sys, root.
+
+ When installing Courier authentication library for the first time, it is
+ highly recommended to create a "courier" userid and groupid, so that
+ specifying these options will not be necessary.
+
+ This configure script descends from the old authentication library that
+ was included in the older Courier, Courier-IMAP, and SqWebMail packages.
+ As such, it also has many other undocumented options that manually disable
+ specific authentication modules.
+
+ These options are no longer officially documented. Individual modules can
+ be disabled after installation, by editing the authdaemonrc configuration
+ file.
+
+ VARIABLE=value
+
+ Environment variables may be set either before running the configure
+ script, or by providing the environment variables as parameters to the
+ configure script. Example:
+
+ ./configure --with-mailuser=mail --with-mailgroup=mail \
+ CC=/opt/fsf/bin/gcc LDFLAGS=-L/opt/fsf/lib \
+ MAKE=gmake
+
+ The CC environment variable specifies the name of the C compiler that will
+ be used to compile the authentication library. For some reason, on this
+ oddball system some system libraries are installed in /opt/fsf/lib, and
+ the compiler doesn't search this directory by default. Therefore, the
+ compiler needs the "-L/opt/fsf/lib" to properly link all programs, and
+ this option is specified in the LDFLAGS environment variable.
+
+ Another possibility is to add the /opt/fsf/bin directory to the PATH
+ environment variable, prior to running the configure script. The configure
+ script searches for all needed software in the current PATH. Explicitly
+ pointing configure to something, like CC, is only needed if the program is
+ not already in the default PATH.
+
+ Finally, Courier authentication library must be built with GNU make. On
+ this example system the make command is the old SysV-derived make, which
+ will not work. GNU make is installed here as the "gmake" command. The
+ configure script will ordinarily find the make command and be happy with
+ it, by mistake. Explicitly setting MAKE to gmake fixes that (and the human
+ operator also needs to invoke the gmake command also).
+
+Dependencies
+
+ On a minimum, bare-bones system, the Courier authentication library builds
+ support for garden-variety authentication against system accounts (from
+ the system's password file, /etc/passwd).
+
+ If the configure script detects that certain optional software components
+ are installed, additional authentication modules will be built and
+ installed. This chapter describes what needs to be installed in order to
+ build the optional authentication modules.
+
+ NOTE: In all cases, it is not sufficient to install the runtime support
+ libraries for the following components. In order to build the
+ authentication modules the DEVELOPMENT LIBRARIES for the following
+ software packages must be installed. The development libraries are
+ usually a separate package, that must be installed in addition to the
+ package that adds alleged support for the following software libraries.
+
+ * GDBM or Berkeley DB library - The userdb authentication module will be
+ built if either library is installed. The userdb authentication module
+ includes Perl scripts that maintain a list of available accounts in
+ plain text files. A Perl script then compiles the account list into a
+ binary database, either GDBM or DB, which is then used to look up
+ account information.
+ * OpenLDAP - The LDAP authentication modules requires OpenLDAP client
+ libraries to be installed. Sometimes there's some confusion when
+ commercial LDAP servers are used, which come with their own
+ development toolkits, which use a different API than OpenLDAP. Even if
+ a commercial LDAP server is used to provide LDAP services, OpenLDAP is
+ still required to enable LDAP services in Courier.
+ * MySQL/PostgreSQL - The MySQL and PostgreSQL authentication modules
+ require, obviously, MySQL/PostgreSQL development libraries.
+
+What gets installed
+
+ * /usr/local/etc/authlib - the configuration files.
+ * /usr/local/sbin - the authdaemond startup script; several utility
+ programs (courierlogger, authconfig, authtest, authenumerate); and
+ userdb scripts.
+ * /usr/local/lib/courier-authlib - various authentication modules, as
+ shared libraries.
+ * /usr/local/libexec/courier-authlib - some miscellaneous stuff.
+ * /usr/local/var/authdaemon - a subdirectory that contains the
+ filesystem socket which authdaemond listens on.
+ * /usr/local/include - a header file that Courier packages will use to
+ build against courier-authlib.
+
+ Toolchain options to the configure script may be used to select
+ alternative installation directories for these components.
+
+ Post-installation cleanup
+
+ On most systems, after running make install-configure all static libraries
+ can be removed from the /usr/local/lib/courier-authlib directory:
+
+ rm -rf /usr/local/lib/courier-authlib/*.a
+
+ The Courier authentication library uses only the shared libraries. The
+ static versions of the shared libraries are not used. They are installed
+ by default, via libtool, but are not really needed. On most platforms the
+ libtool files, "*.la" can also be removed. Do not remove any soft links.
+
+For more information
+
+ Following "make install", see the [13]README_authlib.html file for details
+ on setting up the authentication modules. The README_authlib.html file
+ gets assembled as part of the build process.
+
+ Before proceding to install any other packages, be sure to verify that the
+ authentication library is working by running the authtest command, as
+ documented in the README_authlib.html file.
+
+Starting and stopping the authentication daemon
+
+ The following command must be added to your system startup script, in
+ order to initialize the authentication library when booting:
+
+ /usr/local/sbin/authdaemond start
+
+ Similarly, the authentication library can be stopped by the "authdaemond
+ stop" command. After editing the authdaemonrc configuration file use
+ "authdaemond restart" command to reconfigure the daemon process. Systems
+ that use SYSV-derived initscripts can use the "courier-authlib.sysvinit"
+ script, which gets built in the source directory, to start and stop
+ authdaemond when the system boots or halts.
+
+Building RPMs
+
+ See http://www.courier-mta.org/FAQ.html#rpm for instructions on building
+ binary RPMs from the source tarball. Those instructions will work for this
+ package.
+
+ NOTE:
+
+ RPM will refuse to build the Courier authentication library unless all
+ prerequisite development libraries for LDAP, MySQL, and PostgreSQL are
+ installed. Do not try to hack the RPM build script to ignore these
+ dependencies! For simplicity's and maintainability sake the RPM build
+ script creates all available authentication modules. All extra
+ authentication modules will be built as optional subpackages. They do
+ not have to be installed at runtime. Install the LDAP, MySQL, and
+ PostgreSQL development libraries only for the duration of building
+ binary RPMs. They can be uninstalled afterwards.
+
+Guidelines for using other package managers
+
+ The recommended way to build packages can be inferred from the RPM build
+ script. It is summarized here for convenience:
+
+ * Decide whether or not Courier-specific userid and groupid needs to be
+ created, and, if so, make the necessary arrangements.
+ * Ensure that all prerequisite development libraries are available.
+ * Run the configure script, run make, then make install as usual.
+ * Copy the "sysconftool" and "authmigrate" scripts somewhere into the
+ installation tree. A good place would be %libexecdir%/courier-authlib.
+ This is the 'make install-migrate' and 'make install-upgrade'
+ commands. Don't run them at build time. Instead, arrange for the
+ package installation script to run the authmigrate script first, then
+ "sysconftool %sysconfdir%/authlib/*.dist", after the package is
+ installed OR UPGRADED.
+ * The "authdaemond", "authenumerate", and "authtest" commands can be
+ renamed, to avoid name clashes.
+ * Remove all static libraries from %libdir%/courier-authlib.
+
+ Now, create the installable packages, as follows:
+
+ * %libdir%/courier-authlib/libauthldap* goes into the LDAP subpackage.
+ * %libdir%/courier-authlib/libauthmysql* goes into the MySQL subpackage.
+ * %libdir%/courier-authlib/libauthpgsql* goes into the PostgreSQL
+ subpackage.
+ * %libdir%/courier-authlib/libauthuserdb* goes into the userdb
+ subpackage.
+ * Everything else can go into the main package. Optionally, the
+ courierauthconfig binary, stuff in %includedir%, and in %mandir%/man3,
+ can go into a devel subpackage.
+
+References
+
+ Visible links
+ 1. file:///home/mrsam/src/courier-authlib/INSTALL.html#Requirements
+ 2. file:///home/mrsam/src/courier-authlib/INSTALL.html#Installation
+ 3. file:///home/mrsam/src/courier-authlib/INSTALL.html#deps
+ 4. file:///home/mrsam/src/courier-authlib/INSTALL.html#What
+ 5. file:///home/mrsam/src/courier-authlib/INSTALL.html#manpage
+ 6. file:///home/mrsam/src/courier-authlib/INSTALL.html#Starting
+ 7. file:///home/mrsam/src/courier-authlib/INSTALL.html#Building
+ 8. file:///home/mrsam/src/courier-authlib/INSTALL.html#Guidelines
+ 9. http://www.gnu.org/software/gcc/
+ 10. http://www.gnu.org/software/binutils/
+ 11. http://www.gnu.org/software/libtool/
+ 12. http://www.gnu.org/software/make/
+ 13. file:///home/mrsam/src/courier-authlib/README_authlib.html
--- /dev/null
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <title>INSTALL</title>
+ <meta name="generator" content="amaya 8.7, see http://www.w3.org/Amaya/" />
+ <!-- $Id: INSTALL.html,v 1.6 2005/07/02 14:48:57 mrsam Exp $ -->
+ <!-- Copyright 2004 Double Precision, Inc. See COPYING for -->
+ <!-- distribution information. -->
+</head>
+
+<body>
+<h1>Table of Contents</h1>
+
+<p>In this document (see INSTALL.html for the formatted version of this
+INSTALL file):</p>
+<ul>
+ <li><a onclick="" href="#Requirements">Requirements</a></li>
+ <li><a onclick="" href="#Installation">Installation overview</a></li>
+ <li><a onclick="" href="#deps">Dependencies</a></li>
+ <li><a onclick="" href="#What">What gets installed</a></li>
+ <li><a onclick="" href="#manpage">For more information</a></li>
+ <li><a onclick="" href="#Starting">Starting and stopping the authentication
+ daemon</a></li>
+ <li><a onclick="" href="#Building">Building RPMs</a></li>
+ <li><a onclick="" href="#Guidelines">Guidelines for using other package
+ managers</a></li>
+</ul>
+
+<h2><a name="Requirements" id="Requirements">Requirements</a></h2>
+
+<p>See the README file for a general description of this library. The
+following software should be installed before building the Courier
+authentication library:</p>
+<ul>
+ <li>A modern version of gcc (<a onclick=""
+ href="http://www.gnu.org/software/gcc/">http://www.gnu.org/software/gcc/</a>)</li>
+ <li>The GNU linker (<a onclick=""
+ href="http://www.gnu.org/software/binutils/">http://www.gnu.org/software/binutils/</a>)</li>
+ <li>Libtool (<a onclick=""
+ href="http://www.gnu.org/software/libtool/">http://www.gnu.org/software/libtool/</a>)</li>
+ <li>GNU make (<a onclick=""
+ href="http://www.gnu.org/software/make/">http://www.gnu.org/software/make/</a>)</li>
+ <li>The "<code>expect</code>" command. <code>expect</code> is usually
+ included with most systems. <code>Expect</code> can be downloaded from
+ <code>http://expect.nist.gov/</code> if it's not installed on your
+ system. This utility is used to change system login passwords, by
+ scripting the <code>passwd</code> command. If you do not have
+ <code>expect</code> installed you will not be able to change system login
+ passwords. However non-system authentication modules (LDAP, PostgreSQL,
+ and others) will work.</li>
+</ul>
+
+<p>Courier-authlib uses Libtool to build shared libraries. Libtool is not
+strict required, but Libtool should be installed unless a good -- a very-very
+good -- reason exists not to. If Libtool is not installed, a copy of Libtool
+in courier-authlib's source will be used. However, this may cause problems
+later down the road, if either another Libtool-using package is installed
+later, or if Libtool itself is installed. Bottom line: install Libtool.</p>
+
+<p>On non-Linux platforms the GNU linker is also required. Courier-authlib's
+build script uses some GNU linker-specific options. It's possible to manually
+specify the native linker's equivalent options manually, if they exist. If
+the native linker does not have the equivalent options, the GNU linker will
+have to be installed.</p>
+
+<p>On the other hand, GNU make will be required in almost every case.
+SYSV-derived make variants (probably) will not work.</p>
+
+<p>The same line of logic also applies to gcc. So, strictly speaking, only a
+basic C compiler, GNU make and libtool, are really needed to build
+courier-authlib. Still, try the following before giving up if problems occur
+when building this package:</p>
+<ol>
+ <li>Install a recent version of the GNU linker</li>
+ <li>Install the current version of Libtool</li>
+ <li>Install the current version of gcc</li>
+</ol>
+
+<h2><a name="Installation" id="Installation">Installation overview</a></h2>
+
+<p>The following sequence of commands should be sufficient to install
+courier-authlib in most cases:</p>
+<pre>./configure [options] [variable=value]*...
+make
+make install
+make install-migrate
+make install-configure</pre>
+
+<blockquote>
+ <p><strong>NOTE:</strong> On the BSD family, GNU make is usually the
+ 'gmake' command. Use the 'gmake' command, instead of 'make'.</p>
+</blockquote>
+
+<blockquote>
+ <p><strong>NOTE:</strong> It might appear that the <code>configure</code>
+ script is stuck in an infinite loop. This is only an optical illusion. The
+ <code>configure</code> script takes several minutes to complete. The
+ Courier authentication library consists of many small modules, each with
+ its own configuration script; and all configuration scripts are built from
+ the same template. When they are invoked, one at a time, an illusion of an
+ infinite loop appears.</p>
+</blockquote>
+
+<p>Courier-authlib is a requirement starting with the following Courier
+package versions: Courier 0.48, Courier-IMAP 4.0, SqWebMail 5.0. When
+upgrading from earlier versions of these packages, install the
+Courier-authlib package first, then upgrade the existing package.</p>
+
+<p>The '<code>make install-migrate</code>' command imports the authentication
+configuration from earlier versions of these packages. '<code>make
+install-migrate</code>' is not needed otherwise.</p>
+
+<p>The '<code>make install-migrate</code>' command searches all the known
+default installation directories for Courier, Courier-IMAP, and SqWebMail,
+and imports the older configuration files. If the older versions of these
+packages are installed in some unusual, non-standard, directories, the
+<code>make install-migrate</code> command won't find them. Instead, copy
+those configuration files (<code>authdaemonrc</code>,
+<code>authldaprc</code>, <code>authmysqlprc</code>,
+<code>authpgsqlprc</code>, and <code>userdb</code>) by hand. <strong>DO NOT
+COPY</strong> <code>authdaemonrc.dist</code>, <code>authldaprc.dist</code>,
+<code>authmysqlprc.dist</code>, and <code>authpgsqlprc.dist</code>.</p>
+
+<p>After finishing '<code>make install-migrate</code>', the rest of the
+installation steps, and after upgrading Courier, Courier-IMAP, or SqWebMail
+to the new versions, to avoid future confusion the old copies of these
+configuration files (including the <code>.dist</code> files), should be
+removed from Courier/Courier-IMAP/SqWebMail's configuration directory. They
+now live in Courier-authlib's configuration directory
+(<code>/usr/local/etc/authlib</code>, or whatever was specified to the
+<code>configure</code> script).</p>
+
+<p>The '<code>make install-configure</code>' command is required; it installs
+and updates the configuration files; this command must be executed when
+installing Courier-authlib for the first time, and when upgrading from an
+older version.</p>
+
+<h3>Configuration options</h3>
+
+<p>The configure script takes the usual <code>autoconf</code> options:
+<code>--prefix</code>, <code>--bindir</code>, and the rest of the usual
+toolchain options. The default installation directories should be sufficient,
+though.</p>
+
+<p><strong>DO NOT USE</strong> the <code>--disable-static</code>, or
+<code>--enable-static=no</code> option. Both static and shared library
+options must be enabled for courier-authlib to build properly (but see
+"Post-installation cleanup" below).</p>
+
+<h4><code>--without-stdheaderdir</code></h4>
+
+<p>The default configuration installs development files in
+<code>/usr/local/include</code> (see "What gets installed", below). This
+directory is usually in the compiler's search path for header files. This
+option must be specified if the compiler does NOT search for header files in
+<code>/usr/local/include</code> by default.</p>
+
+<p>This option must also be specified if other configuration options (such as
+<code>--prefix</code> or <code>--includedir</code>) specify a different
+installation directory, and the new directory is also not searched by the
+compiler, by default</p>
+
+<h4><code>--with-mailuser=<em>userid</em>,
+--with-mailgroup=<em>groupid</em></code></h4>
+
+<p>"userid" is a reserved system username, "groupid" is a reserved system
+groupname. These two options should be used before installing Courier for the
+first time. These options are not required before installing Courier-IMAP or
+SqWebMail.</p>
+
+<p>These options specify the user/group that will own the configuration
+files, and the socket that authentication daemon process listens on. This is
+a key part of Courier's security model.</p>
+
+<p>These options should not be necessary if upgrading from an earlier version
+of Courier and/or this authentication library. The default userid and groupid
+are computed as follows:</p>
+<ul>
+ <li>If an earlier version of the Courier authentication library is already
+ installed in the same directory, the userid and the groupid is the same
+ as the earlier version, otherwise:</li>
+ <li>If an earlier version of the Courier package is installed (only the
+ Courier package, the Courier-IMAP and SqWebMail packages do not carry
+ this information), the userid and the groupid is the same as the ones
+ used to configure Courier, otherwise:</li>
+ <li>The userid is the first userid from the following list which exists in
+ the system: courier, daemon, adm, bin, root; and the groupid is the first
+ groupid from the following list which exists in the system: courier,
+ daemon, adm, sys, root.</li>
+</ul>
+
+<p>When installing Courier authentication library for the first time, it is
+highly recommended to create a "courier" userid and groupid, so that
+specifying these options will not be necessary.</p>
+
+<p>This configure script descends from the old authentication library that
+was included in the older Courier, Courier-IMAP, and SqWebMail packages. As
+such, it also has many other undocumented options that manually disable
+specific authentication modules.</p>
+
+<p><strong>These options are no longer officially documented.</strong>
+Individual modules can be disabled after installation, by editing the
+<code>authdaemonrc</code> configuration file.</p>
+
+<h4><code>VARIABLE=</code><em><code>value</code></em></h4>
+
+<p>Environment variables may be set either before running the configure
+script, or by providing the environment variables as parameters to the
+configure script. Example:</p>
+
+<blockquote>
+ <pre>./configure --with-mailuser=mail --with-mailgroup=mail \
+ CC=/opt/fsf/bin/gcc LDFLAGS=-L/opt/fsf/lib \
+ MAKE=gmake</pre>
+</blockquote>
+
+<p>The <code>CC</code> environment variable specifies the name of the C
+compiler that will be used to compile the authentication library. For some
+reason, on this oddball system some system libraries are installed in
+<code>/opt/fsf/lib</code>, and the compiler doesn't search this directory by
+default. Therefore, the compiler needs the "<code>-L/opt/fsf/lib</code>" to
+properly link all programs, and this option is specified in the
+<code>LDFLAGS</code> environment variable.</p>
+
+<p>Another possibility is to add the <code>/opt/fsf/bin</code> directory to
+the <code>PATH</code> environment variable, prior to running the
+<code>configure</code> script. The <code>configure</code> script searches for
+all needed software in the current <code>PATH</code>. Explicitly pointing
+configure to something, like <code>CC</code>, is only needed if the program
+is not already in the default PATH.</p>
+
+<p>Finally, Courier authentication library must be built with GNU make. On
+this example system the <code>make</code> command is the old SysV-derived
+make, which will not work. GNU make is installed here as the
+"<code>gmake</code>" command. The <code>configure</code> script will
+ordinarily find the <code>make</code> command and be happy with it, by
+mistake. Explicitly setting <code>MAKE</code> to <code>gmake</code> fixes
+that (and the human operator also needs to invoke the <code>gmake</code>
+command also).</p>
+
+<h2><a name="deps" id="Dependencies">Dependencies</a></h2>
+
+<p>On a minimum, bare-bones system, the Courier authentication library builds
+support for garden-variety authentication against system accounts (from the
+system's password file, <code>/etc/passwd</code>).</p>
+
+<p>If the <code>configure</code> script detects that certain optional
+software components are installed, additional authentication modules will be
+built and installed. This chapter describes what needs to be installed in
+order to build the optional authentication modules.</p>
+
+<blockquote>
+ <p><strong>NOTE:</strong> In all cases, it is not sufficient to install the
+ runtime support libraries for the following components. In order to build
+ the authentication modules the <strong>DEVELOPMENT LIBRARIES</strong> for
+ the following software packages must be installed. The development
+ libraries are usually a separate package, that must be installed in
+ addition to the package that adds alleged support for the following
+ software libraries.</p>
+</blockquote>
+<ul>
+ <li><strong>GDBM or Berkeley DB library</strong> - The <code>userdb</code>
+ authentication module will be built if either library is installed. The
+ <code>userdb</code> authentication module includes Perl scripts that
+ maintain a list of available accounts in plain text files. A Perl script
+ then compiles the account list into a binary database, either GDBM or DB,
+ which is then used to look up account information.</li>
+ <li><strong>OpenLDAP</strong> - The LDAP authentication modules requires
+ OpenLDAP client libraries to be installed. Sometimes there's some
+ confusion when commercial LDAP servers are used, which come with their
+ own development toolkits, which use a different API than OpenLDAP. Even
+ if a commercial LDAP server is used to provide LDAP services, OpenLDAP is
+ still required to enable LDAP services in Courier.</li>
+ <li><strong>MySQL/PostgreSQL</strong> - The MySQL and PostgreSQL
+ authentication modules require, obviously, MySQL/PostgreSQL development
+ libraries.<br />
+ </li>
+</ul>
+
+<h2><a name="What" id="What">What gets installed</a></h2>
+<ul>
+ <li><code>/usr/local/etc/authlib</code> - the configuration files.</li>
+ <li><code>/usr/local/sbin</code> - the authdaemond startup script; several
+ utility programs (courierlogger, authconfig, authtest, authenumerate);
+ and userdb scripts.</li>
+ <li><code>/usr/local/lib/courier-authlib</code> - various authentication
+ modules, as shared libraries.</li>
+ <li><code>/usr/local/libexec/courier-authlib</code> - some miscellaneous
+ stuff.</li>
+ <li><code>/usr/local/var/authdaemon</code> - a subdirectory that contains
+ the filesystem socket which authdaemond listens on.</li>
+ <li><code>/usr/local/include</code> - a header file that Courier packages
+ will use to build against courier-authlib.</li>
+</ul>
+
+<p>Toolchain options to the <code>configure</code> script may be used to
+select alternative installation directories for these components.</p>
+
+<h3>Post-installation cleanup</h3>
+
+<p>On most systems, after running <code>make install-configure</code> all
+static libraries can be removed from the
+<code>/usr/local/lib/courier-authlib</code> directory:</p>
+
+<p><code>rm -rf /usr/local/lib/courier-authlib/*.a</code></p>
+
+<p>The Courier authentication library uses only the shared libraries. The
+static versions of the shared libraries are not used. They are installed by
+default, via libtool, but are not really needed. On most platforms the
+libtool files, "*.la" can also be removed. Do not remove any soft links.</p>
+
+<h2><a name="manpage" id="manpage">For more information</a></h2>
+
+<p>Following "<code>make install</code>", see the <a
+href="README_authlib.html"><code>README_authlib.html</code></a> file for
+details on setting up the authentication modules. The
+<code>README_authlib.html</code> file gets assembled as part of the build
+process.</p>
+
+<p>Before proceding to install any other packages, be sure to verify that the
+authentication library is working by running the <code>authtest</code>
+command, as documented in the <code>README_authlib.html</code> file.</p>
+
+<h2><a name="Starting" id="Starting">Starting and stopping the authentication
+daemon</a></h2>
+
+<p>The following command must be added to your system startup script, in
+order to initialize the authentication library when booting:</p>
+<pre>/usr/local/sbin/authdaemond start</pre>
+
+<p>Similarly, the authentication library can be stopped by the
+"<code>authdaemond stop</code>" command. After editing the
+<code>authdaemonrc</code> configuration file use "<code>authdaemond
+restart</code>" command to reconfigure the daemon process. Systems that use
+SYSV-derived initscripts can use the "<code>courier-authlib.sysvinit</code>"
+script, which gets built in the source directory, to start and stop
+<code>authdaemond</code> when the system boots or halts.</p>
+
+<h2><a name="Building" id="Building">Building RPMs</a></h2>
+
+<p>See <a onclick=""><code>http://www.courier-mta.org/FAQ.html#rpm</code></a>
+for instructions on building binary RPMs from the source tarball. Those
+instructions will work for this package.</p>
+
+<blockquote>
+ <p><strong>NOTE:</strong></p>
+
+ <p>RPM will refuse to build the Courier authentication library unless all
+ prerequisite development libraries for LDAP, MySQL, and PostgreSQL are
+ installed. <strong>Do not try to hack the RPM build script to ignore these
+ dependencies!</strong> For simplicity's and maintainability sake the RPM
+ build script creates all available authentication modules. All extra
+ authentication modules will be built as <em>optional</em> subpackages. They
+ do not have to be installed at runtime. Install the LDAP, MySQL, and
+ PostgreSQL development libraries only for the duration of building binary
+ RPMs. They can be uninstalled afterwards.</p>
+</blockquote>
+
+<h2><a name="Guidelines" id="Guidelines">Guidelines for using other package
+managers</a></h2>
+
+<p>The recommended way to build packages can be inferred from the RPM build
+script. It is summarized here for convenience:</p>
+<ul>
+ <li>Decide whether or not Courier-specific userid and groupid needs to be
+ created, and, if so, make the necessary arrangements.</li>
+ <li>Ensure that all prerequisite development libraries are available.</li>
+ <li>Run the <code>configure</code> script, run <code>make</code>, then
+ <code>make install</code> as usual.</li>
+ <li>Copy the "<code>sysconftool</code>" and "<code>authmigrate</code>"
+ scripts somewhere into the installation tree. A good place would be
+ <code>%libexecdir%/courier-authlib</code>. This is the '<code>make
+ install-migrate</code>' and '<code>make install-upgrade</code>' commands.
+ Don't run them at build time. Instead, arrange for the package
+ installation script to run the <code>authmigrate</code> script first,
+ then "<code>sysconftool %sysconfdir%/authlib/*.dist</code>", after the
+ package is installed <strong>OR UPGRADED</strong>.</li>
+ <li>The "<code>authdaemond</code>", "<code>authenumerate</code>", and
+ "<code>authtest</code>" commands can be renamed, to avoid name
+ clashes.</li>
+ <li>Remove all static libraries from
+ <code>%libdir%/courier-authlib</code>.</li>
+</ul>
+
+<p>Now, create the installable packages, as follows:</p>
+<ul>
+ <li><code>%libdir%/courier-authlib/libauthldap*</code> goes into the LDAP
+ subpackage.</li>
+ <li><code>%libdir%/courier-authlib/libauthmysql*</code> goes into the MySQL
+ subpackage.</li>
+ <li><code>%libdir%/courier-authlib/libauthpgsql*</code> goes into the
+ PostgreSQL subpackage.</li>
+ <li><code>%libdir%/courier-authlib/libauthuserdb*</code> goes into the
+ userdb subpackage.</li>
+ <li>Everything else can go into the main package. Optionally, the
+ <code>courierauthconfig</code> binary, stuff in
+ <code>%includedir%</code>, and in <code>%mandir%/man3</code>, can go into
+ a devel subpackage.</li>
+</ul>
+
+<p></p>
+</body>
+</html>
--- /dev/null
+# $Id: Makefile.am,v 1.116 2007/04/01 00:13:35 mrsam Exp $
+#
+# Copyright 1998 - 2006 Double Precision, Inc. See COPYING for
+# distribution information.
+
+AUTOMAKE = srcdir=${srcdir} @SHELL@ ${srcdir}/automake.fix @AUTOMAKE@
+AUTOMAKE_OPTIONS=dist-bzip2
+
+SUBDIRS=@LIBLTDL_SUBDIR@ @DBSUBDIR@ md5 sha1 libhmac numlib makedat userdb rfc822 random128 liblock liblog
+DIST_SUBDIRS=libltdl gdbmobj bdbobj md5 sha1 libhmac numlib makedat userdb rfc822 random128 liblock liblog
+
+INCLUDES = $(LTDLINCL)
+
+modules=@LIBAUTHUSERDB@ \
+ @LIBAUTHPAM@ @LIBAUTHPWD@ @LIBAUTHSHADOW@ \
+ @LIBAUTHPGSQL@ @LIBAUTHLDAP@ @LIBAUTHMYSQL@ \
+ @LIBAUTHCUSTOM@ @LIBAUTHVCHKPW@ @LIBAUTHPIPE@
+
+pkglibexecdir=$(libexecdir)/courier-authlib
+pkglibexec_SCRIPTS=authsystem.passwd
+
+pkglib_LTLIBRARIES=libcourierauth.la \
+ libcourierauthsasl.la libcourierauthsaslclient.la \
+ libcourierauthcommon.la $(modules)
+sbin_SCRIPTS=authdaemond
+sbin_PROGRAMS=authtest authenumerate authpasswd
+bin_PROGRAMS=courierauthconfig
+
+EXTRA_LTLIBRARIES=libauthuserdb.la \
+ libauthpam.la libauthpwd.la libauthshadow.la \
+ libauthvchkpw.la \
+ libauthpgsql.la \
+ libauthldap.la \
+ libauthmysql.la \
+ libauthcustom.la \
+ libauthpipe.la
+
+CLEANFILES=authldaprc.h authmysqlrc.h authdaemonrc.h vpopmail_config.h \
+ authpgsqlrc.h authpiperc.h authdaemon \
+ authlib.3 authlib.html packageversion.h \
+ authchangepwdir.h sbindir.h pkglibdir.h pkgincludedir.h \
+ mailusergroup.h authinfodaemondlist.c permissions.dat \
+ README.authdebug.html
+
+DISTCLEANFILES=dbobj.config README_authlib.html
+
+commonlibdep=libcourierauthcommon.la
+commonldflags=-module -rpath $(pkglibdir) -export-symbols-regex 'courier_auth.*_init'
+commonlibadd=libcourierauthcommon.la
+
+libcourierauthcommon_t=@CRYPTLIBS@
+libcourierauthcommon_la_SOURCES= \
+ auth.h courierauth.h \
+ authpwdenumerate.c \
+ authsaslfrombase64.c authsasltobase64.c \
+ authstaticlist.h \
+ authsyschangepwd.c authsyscommon.c \
+ cramlib.c cramlib.h \
+ checkpassword.c cryptpassword.c \
+ $(checkpasswordmd5c) $(checkpasswordsha1c)
+
+libcourierauthcommon_la_DEPENDENCIES=libcourierauth.la
+libcourierauthcommon_la_LIBADD=libcourierauth.la
+libcourierauthcommon_la_LDFLAGS=$(libcourierauthcommon_t:%=-Wl,%)
+
+libcourierauth_la_SOURCES=authdaemon.c authdaemonlib.c preauthdaemon.c \
+ authmoduser2.c authmoduser3.c debug.c \
+ courierauthdebug.h \
+ authoption.c
+libcourierauth_la_LIBADD=@HMACLIB@ @MD5LIB@ @SHA1LIB@ numlib/libnumlib.la \
+ random128/librandom128.la rfc822/libencode.la
+libcourierauth_la_LDFLAGS=@NETLIBS@
+
+# The userdb module
+
+libauthuserdb_t=userdb/libuserdb.la @dblibrary@ @LIBGDBM@ @LIBDB@
+libauthuserdb_la_SOURCES=authuserdb.c preauthuserdb.c preauthuserdbcommon.c \
+ authuserdbpwd.c
+libauthuserdb_la_DEPENDENCIES=libcourierauthcommon.la @dblibrary@
+libauthuserdb_la_LIBADD=$(commonlibadd) $(libauthuserdb_t)
+libauthuserdb_la_LDFLAGS=$(commonldflags)
+
+# the authpam module
+
+libauthpam_t=-lpam @SHADOWLIBS@ @AUTHPAMCRYPT@ @LIBDL@
+
+libauthpam_la_SOURCES=authpam.c preauthpam.c authwait.h
+libauthpam_la_DEPENDENCIES=$(commonlibdep)
+libauthpam_la_LIBADD=$(commonlibadd)
+libauthpam_la_LDFLAGS=$(commonldflags) $(libauthpam_t)
+
+# The authpwd module
+
+libauthpwd_la_SOURCES=authpwd.c preauthpwd.c
+libauthpwd_la_DEPENDENCIES=$(commonlibdep)
+libauthpwd_la_LIBADD=$(commonlibadd)
+libauthpwd_la_LDFLAGS=$(commonldflags)
+
+# The authshadow module
+
+libauthshadow_t=@SHADOWLIBS@
+
+libauthshadow_la_SOURCES=authshadow.c preauthshadow.c
+libauthshadow_la_DEPENDENCIES=$(commonlibdep)
+libauthshadow_la_LIBADD=$(commonlibadd)
+libauthshadow_la_LDFLAGS=$(commonldflags) $(libauthshadow_t)
+
+# The authvchkpw module
+
+libauthvchkpw_t=@VPOPMAILLIBS@ @LIBM@
+libauthvchkpw_la_SOURCES=authvchkpw.c authvchkpwlib.c preauthvchkpw.c
+libauthvchkpw_la_DEPENDENCIES=$(commonlibdep)
+libauthvchkpw_la_LIBADD=$(commonlibadd)
+libauthvchkpw_la_LDFLAGS=$(commonldflags) $(libauthvchkpw_t)
+
+authvchkpw.lo: authvchkpw.c vpopmail_config.h
+preauthvchkpw.lo: preauthvchkpw.c vpopmail_config.h
+
+vpopmail_config.h:
+ echo '#include "@vpopmail_home@/include/config.h"' >vpopmail_config.h
+
+# The authpgsql module
+
+libauthpgsql_t=@PGSQL_LIBS@ @LIBM@ @NETLIBS@
+
+libauthpgsql_la_SOURCES=authpgsql.c preauthpgsql.c authpgsqllib.c authpgsql.h
+libauthpgsql_la_DEPENDENCIES=$(commonlibdep)
+libauthpgsql_la_LIBADD=$(commonlibadd)
+libauthpgsql_la_LDFLAGS=$(commonldflags) $(libauthpgsql_t)
+
+authpgsqllib.lo: authpgsqllib.c authpgsqlrc.h
+
+
+if HAVE_AUTHPGSQL
+
+install-authpgsqlrc:
+ $(mkinstalldirs) $(DESTDIR)`dirname @authpgsqlrc@` || :
+ $(INSTALL_DATA) -m 660 $(srcdir)/authpgsqlrc \
+ $(DESTDIR)@authpgsqlrc@.dist
+ -chown @mailuser@ $(DESTDIR)@authpgsqlrc@.dist
+ -chgrp @mailgroup@ $(DESTDIR)@authpgsqlrc@.dist
+
+uninstall-authpgsqlrc:
+ rm -f $(DESTDIR)@authpgsqlrc@.dist
+
+else
+
+install-authpgsqlrc:
+ @:
+
+uninstall-authpgsqlrc:
+ @:
+endif
+
+authpgsqlrc.h:
+ echo "#define AUTHPGSQLRC \"@authpgsqlrc@\"" >authpgsqlrc.h
+
+
+# The authldap module
+
+libauthldap_t=@LDAPLIBS@ @NETLIBS@
+libauthldap_la_SOURCES=authldap.c preauthldap.c authldaplib.c authldap.h
+libauthldap_la_DEPENDENCIES=$(commonlibdep)
+libauthldap_la_LIBADD=$(commonlibadd)
+libauthldap_la_LDFLAGS=$(commonldflags) $(libauthldap_t)
+
+authldaplib.lo: authldaplib.c authldaprc.h
+
+if HAVE_LDAP
+
+install-authldaprc:
+ $(mkinstalldirs) $(DESTDIR)`dirname @authldaprc@` || :
+ $(INSTALL_DATA) -m 660 $(srcdir)/authldaprc \
+ $(DESTDIR)@authldaprc@.dist
+ -chown @mailuser@ $(DESTDIR)@authldaprc@.dist
+ -chgrp @mailgroup@ $(DESTDIR)@authldaprc@.dist
+
+uninstall-authldaprc:
+ rm -f $(DESTDIR)@authldaprc@.dist
+
+else
+install-authldaprc:
+ @:
+
+uninstall-authldaprc:
+ @:
+endif
+
+authldaprc.h:
+ echo "#define AUTHLDAPRC \"@authldaprc@\"" >authldaprc.h
+
+# The authmysql module
+
+libauthmysql_t=@MYSQL_LIBS@ @LIBM@ @NETLIBS@
+
+libauthmysql_la_SOURCES=authmysql.c preauthmysql.c authmysqllib.c authmysql.h
+libauthmysql_la_DEPENDENCIES=$(commonlibdep)
+libauthmysql_la_LIBADD=$(commonlibadd)
+libauthmysql_la_LDFLAGS=$(commonldflags) $(libauthmysql_t)
+
+authmysqllib.lo: authmysqllib.c authmysqlrc.h
+
+if HAVE_AUTHMYSQL
+install-authmysqlrc:
+ $(mkinstalldirs) $(DESTDIR)`dirname @authmysqlrc@` || :
+ $(INSTALL_DATA) -m 660 $(srcdir)/authmysqlrc \
+ $(DESTDIR)@authmysqlrc@.dist
+ -chown @mailuser@ $(DESTDIR)@authmysqlrc@.dist
+ -chgrp @mailgroup@ $(DESTDIR)@authmysqlrc@.dist
+
+uninstall-authmysqlrc:
+ rm -f $(DESTDIR)@authmysqlrc@.dist
+
+else
+install-authmysqlrc:
+ @:
+
+uninstall-authmysqlrc:
+ @:
+endif
+
+authmysqlrc.h:
+ echo "#define AUTHMYSQLRC \"@authmysqlrc@\"" >authmysqlrc.h
+
+# The authcustom module
+
+libauthcustom_la_SOURCES=authcustom.c preauthcustom.c authcustom.h
+libauthcustom_la_DEPENDENCIES=$(commonlibdep)
+libauthcustom_la_LIBADD=$(commonlibadd)
+libauthcustom_la_LDFLAGS=$(commonldflags)
+
+# The authpipe module
+libauthpipe_la_SOURCES=authpipe.c authpipelib.h authpipelib.c
+libauthpipe_la_DEPENDENCIES=$(commonlibdep)
+libauthpipe_la_LIBADD=$(commonlibadd)
+libauthpipe_la_LDFLAGS=$(commonldflags)
+
+authpipelib.lo: authpipelib.c authpipelib.h authpiperc.h
+
+authpiperc.h:
+ echo "#define PIPE_PROGRAM \"@authProg@\"" >authpiperc.h
+
+
+#
+# AUTHMODULES should be listed in the best authentication order
+#
+
+noinst_PROGRAMS= \
+ authdaemontest authmksock \
+ authdaemondprog
+
+
+if HAVE_MD5
+checkpasswordmd5c=checkpasswordmd5.c
+else
+checkpasswordmd5c=
+endif
+
+if HAVE_SHA1
+checkpasswordsha1c=checkpasswordsha1.c
+else
+checkpasswordsha1c=
+endif
+
+install-authdaemonrc:
+ $(mkinstalldirs) $(DESTDIR)`dirname @authdaemonrc@` || :
+ sed 's/@ALLMODULES@/$(modules:lib%.la=%)/' <authdaemonrc >authdaemonrc.tmp
+ $(INSTALL_DATA) -m 660 authdaemonrc.tmp $(DESTDIR)@authdaemonrc@.dist
+ rm -f authdaemonrc.tmp
+ -chown @mailuser@ $(DESTDIR)@authdaemonrc@.dist
+ -chgrp @mailgroup@ $(DESTDIR)@authdaemonrc@.dist
+
+uninstall-authdaemonrc:
+ rm -f $(DESTDIR)@authdaemonrc@.dist
+
+authdaemonrc.h:
+ echo "#define AUTHDAEMONRC \"@authdaemonrc@\"" >authdaemonrc.h
+ echo "#define AUTHDAEMONVAR \"@authdaemonvar@\"" >>authdaemonrc.h
+ echo "#define AUTHDAEMONPID AUTHDAEMONVAR \"/pid\"" >>authdaemonrc.h
+ echo "#define AUTHDAEMONSOCK AUTHDAEMONVAR \"/socket\"" >>authdaemonrc.h
+ echo "#define AUTHDAEMONLOCK AUTHDAEMONVAR \"/lock\"" >>authdaemonrc.h
+
+HTMLFILES=README.html NEWS.html INSTALL.html \
+ README.authmysql.html README.authpostgres.html
+
+EXTRA_DIST=$(HTMLFILES) sysconftool COPYING COPYING.GPL\
+ authldap.schema \
+ checkpasswordmd5.c checkpasswordsha1.c \
+ authldaprc authmysqlrc authpgsqlrc README.ldap \
+ README.authmysql.myownquery \
+ README.authdebug.html.in automake.fix \
+ courier-authlib.spec \
+ courier-authlib.lpspec pgpkeys.txt \
+ README_authlib.html.in \
+ authlib.html.in authlib.3.in \
+ authpasswd.html authpasswd.1 \
+ authtest.html authtest.1 \
+ auth_sasl.html auth_sasl.3 \
+ auth_generic.html auth_generic.3 \
+ auth_login.html auth_login.3 \
+ auth_passwd.html auth_passwd.3 \
+ auth_getuserinfo.html auth_getuserinfo.3 \
+ auth_enumerate.html auth_enumerate.3 \
+ auth_getoption.html auth_getoption.3 \
+ samplepipe.pl prep.xsl
+
+README: README.html
+ links -dump README.html >README
+
+NEWS: NEWS.html
+ links -dump NEWS.html >NEWS
+
+INSTALL: INSTALL.html
+ links -dump INSTALL.html >INSTALL
+
+libcourierauthsasl_la_SOURCES=\
+ authsasl.c courierauthsasl.h \
+ authsaslcram.c authsasllogin.c authsaslplain.c \
+ authsaslfrombase64.c authsasltobase64.c
+libcourierauthsasl_la_LIBADD=libcourierauth.la
+libcourierauthsasl_la_LDFLAGS=-export-symbols-regex '^auth_sasl$$'
+
+libcourierauthsaslclient_la_SOURCES=courierauthsaslclient.h \
+ authsaslclient.c authsaslclient.h authsaslclientcram.c \
+ authsaslclientcrammd5.c authsaslclientcramsha1.c \
+ authsaslclientlogin.c authsaslclientplain.c \
+ authsaslfrombase64.c authsasltobase64.c
+libcourierauthsaslclient_la_LIBADD=libcourierauth.la
+libcourierauthsaslclient_la_LDFLAGS=-export-symbols-regex '^auth_sasl_client$$'
+
+include_HEADERS=courier_auth_config.h courierauth.h courierauthsasl.h \
+ courierauthsaslclient.h courierauthdebug.h
+
+courierauthconfig_SOURCES=authinfo.c
+
+authpasswd_SOURCES=authpasswd.c
+authpasswd_LDADD=libcourierauthcommon.la \
+ libhmac/libhmac.la md5/libmd5.la sha1/libsha1.la rfc822/libencode.la
+
+authtest_SOURCES=authtest.c
+authtest_DEPENDENCIES=libcourierauth.la
+authtest_LDADD=libcourierauth.la
+
+authenumerate_SOURCES=authenumerate.c
+authenumerate_DEPENDENCIES = libcourierauth.la \
+ numlib/libnumlib.la
+authenumerate_LDADD = libcourierauth.la \
+ numlib/libnumlib.la
+authenumerate_LDFLAGS=
+
+#
+# The main daemon.
+
+authdaemondprog_SOURCES=authdaemond.c
+authdaemondprog_DEPENDENCIES=libcourierauthcommon.la \
+ liblock/liblock.la $(modules) \
+ libhmac/libhmac.la md5/libmd5.la sha1/libsha1.la \
+ rfc822/libencode.la numlib/libnumlib.la
+authdaemondprog_LDADD=$(LIBLTDL) libcourierauthcommon.la liblock/liblock.la \
+ libhmac/libhmac.la md5/libmd5.la sha1/libsha1.la \
+ rfc822/libencode.la numlib/libnumlib.la
+authdaemondprog_LDFLAGS=-export-dynamic $(modules:%=-dlopen %) @NETLIBS@
+
+authdaemontest_SOURCES=authdaemontest.c
+authdaemontest_DEPENDENCIES=libcourierauthcommon.la
+authdaemontest_LDADD=libcourierauthcommon.la @NETLIBS@
+authdaemontest_LDFLAGS=-static
+
+authmksock_SOURCES=authmksock.c
+authmksock_LDADD=@NETLIBS@
+
+man3=authlib.3 auth_generic.3 auth_login.3 auth_getuserinfo.3 \
+ auth_enumerate.3 auth_passwd.3 auth_getoption.3 auth_sasl.3
+man1=authpasswd.1 authtest.1
+
+man_MANS=$(man1) $(man3)
+
+BUILT1=authlib.html authldaprc.h authmysqlrc.h authpgsqlrc.h authpiperc.h \
+ authdaemonrc.h vpopmail_config.h packageversion.h \
+ authchangepwdir.h sbindir.h \
+ pkglibdir.h pkgincludedir.h mailusergroup.h \
+ README_authlib.html
+BUILT_SOURCES=$(BUILT1) $(man3:%.3=%.html) $(man1:%.1=%.html)
+
+authchangepwdir.h: config.status
+ echo '#define AUTHCHANGEPWDIR "$(pkglibexecdir)"' >authchangepwdir.h
+
+sbindir.h: config.status
+ echo '#define SBINDIR "@sbindir@"' >sbindir.h
+
+pkglibdir.h: config.status
+ echo '#define PKGLIBDIR "$(pkglibdir)"' >pkglibdir.h
+
+packageversion.h: config.status
+ echo '#define PKGVERSION "@PACKAGE_VERSION@"' >packageversion.h
+
+pkgincludedir.h: config.status
+ echo '#define PKGINCLUDEDIR "$(includedir)"' >pkgincludedir.h
+
+mailusergroup.h: config.status
+ echo '#define MAILUSER "@mailuser@"' >mailusergroup.h
+ echo '#define MAILGROUP "@mailgroup@"' >>mailusergroup.h
+
+noinst_DATA=$(BUILT_SOURCES)
+
+dist-hook:
+ for f in $(BUILT1) ; do rm -f $(distdir)/$$f; done
+
+# automake still a bit stupid...
+
+install-data-hook: install-authdaemonrc install-authpgsqlrc \
+ install-authldaprc install-authmysqlrc
+ :
+
+install-exec-hook:
+ $(mkinstalldirs) $(DESTDIR)$(bindir) || :
+ $(mkinstalldirs) $(DESTDIR)$(sbindir) || :
+ $(mkinstalldirs) $(DESTDIR)$(pkglibexecdir) || :
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) authdaemondprog $(DESTDIR)$(pkglibexecdir)/authdaemond
+ $(mkinstalldirs) $(DESTDIR)@authdaemonvar@ || :
+ chmod 750 $(DESTDIR)@authdaemonvar@
+ -chown @mailuser@ $(DESTDIR)@authdaemonvar@
+ -chgrp @mailgroup@ $(DESTDIR)@authdaemonvar@
+ test "@LIBAUTHUSERDB@" = "" && exit 0 ;\
+ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) makedat/makedatprog \
+ $(DESTDIR)$(pkglibexecdir)/makedatprog ; \
+ $(INSTALL_SCRIPT) userdb/vchkpw2userdb \
+ $(DESTDIR)$(sbindir)/vchkpw2userdb ; \
+ $(INSTALL_SCRIPT) userdb/pw2userdb \
+ $(DESTDIR)$(sbindir)/pw2userdb ; \
+ $(INSTALL_SCRIPT) userdb/makeuserdb \
+ $(DESTDIR)$(sbindir)/makeuserdb ; \
+ $(INSTALL_SCRIPT) userdb/userdb.pl \
+ $(DESTDIR)$(sbindir)/userdb ; \
+ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) userdb/userdbpw \
+ $(DESTDIR)$(sbindir)/userdbpw ; \
+ $(INSTALL_SCRIPT) userdb-test-cram-md5.pl \
+ $(DESTDIR)$(sbindir)/userdb-test-cram-md5
+
+uninstall-hook: uninstall-authldaprc uninstall-authdaemonrc uninstall-authmysqlrc uninstall-authpgsqlrc
+ rm -f $(DESTDIR)$(pkglibexecdir)/authdaemond
+ test "@AUTHUSERDB@" = "" && exit 0 ;\
+ rm -f $(DESTDIR)$(pkglibexecdir)/makedatprog \
+ $(DESTDIR)$(sbindir)/vchkpw2userdb \
+ $(DESTDIR)$(sbindir)/pw2userdb \
+ $(DESTDIR)$(sbindir)/makeuserdb \
+ $(DESTDIR)$(sbindir)/userdb \
+ $(DESTDIR)$(sbindir)/userdbpw \
+ $(DESTDIR)$(sbindir)/userdb-test-cram-md5
+
+authlib.html: authlib.html.in
+ CONFIG_FILES=authlib.html CONFIG_HEADERS= $(SHELL) ./config.status
+
+authlib.3: authlib.3.in
+ CONFIG_FILES=authlib.3 CONFIG_HEADERS= $(SHELL) ./config.status
+
+if HAVE_SGML
+authpasswd.html: authpasswd.sgml docbook/sgml2html
+ docbook/sgml2html authpasswd.sgml authpasswd.html
+
+authpasswd.1: authpasswd.sgml docbook/sgml2man
+ docbook/sgml2man authpasswd.sgml authpasswd.1
+
+authtest.html: authtest.sgml docbook/sgml2html
+ docbook/sgml2html authtest.sgml authtest.html
+
+authtest.1: authtest.sgml docbook/sgml2man
+ docbook/sgml2man authtest.sgml authtest.1
+
+authlib.html.in: authlib.sgml docbook/sgml2html
+ docbook/sgml2html authlib.sgml authlib.html.in
+
+authlib.3.in: authlib.sgml docbook/sgml2man
+ docbook/sgml2man authlib.sgml authlib.3.in
+
+README_authlib.html.in: README_authlib.sgml docbook/sgml2html
+ docbook/sgml2html README_authlib.sgml README_authlib.html.in
+
+auth_generic.html: auth_generic.sgml authcallback.sgml docbook/sgml2html
+ docbook/sgml2html auth_generic.sgml auth_generic.html
+
+auth_generic.3: auth_generic.sgml authcallback.sgml docbook/sgml2man
+ docbook/sgml2man auth_generic.sgml auth_generic.3
+
+auth_login.html: auth_login.sgml authcallback.sgml docbook/sgml2html
+ docbook/sgml2html auth_login.sgml auth_login.html
+
+auth_login.3: auth_login.sgml authcallback.sgml docbook/sgml2man
+ docbook/sgml2man auth_login.sgml auth_login.3
+
+auth_getuserinfo.html: auth_getuserinfo.sgml authcallback.sgml docbook/sgml2html
+ docbook/sgml2html auth_getuserinfo.sgml auth_getuserinfo.html
+
+auth_getuserinfo.3: auth_getuserinfo.sgml authcallback.sgml docbook/sgml2man
+ docbook/sgml2man auth_getuserinfo.sgml auth_getuserinfo.3
+
+auth_enumerate.html: auth_enumerate.sgml docbook/sgml2html
+ docbook/sgml2html auth_enumerate.sgml auth_enumerate.html
+
+auth_enumerate.3: auth_enumerate.sgml docbook/sgml2man
+ docbook/sgml2man auth_enumerate.sgml auth_enumerate.3
+
+auth_passwd.html: auth_passwd.sgml docbook/sgml2html
+ docbook/sgml2html auth_passwd.sgml auth_passwd.html
+
+auth_passwd.3: auth_passwd.sgml docbook/sgml2man
+ docbook/sgml2man auth_passwd.sgml auth_passwd.3
+
+auth_getoption.html: auth_getoption.sgml docbook/sgml2html
+ docbook/sgml2html auth_getoption.sgml auth_getoption.html
+
+auth_getoption.3: auth_getoption.sgml docbook/sgml2man
+ docbook/sgml2man auth_getoption.sgml auth_getoption.3
+
+auth_sasl.html: auth_sasl.sgml docbook/sgml2html
+ docbook/sgml2html auth_sasl.sgml auth_sasl.html
+
+auth_sasl.3: auth_sasl.sgml docbook/sgml2man
+ docbook/sgml2man auth_sasl.sgml auth_sasl.3
+
+
+endif
+
+README_authlib.html: README_authlib.html.in config.status
+ CONFIG_FILES=README_authlib.html CONFIG_HEADERS= $(SHELL) ./config.status
+
+authdaemond.o: authdaemonrc.h authdaemond.c
+
+
+install-migrate: authmigrate
+ @SHELL@ authmigrate
+
+install-configure:
+ test -f $(DESTDIR)@authdaemonrc@.dist && @SYSCONFTOOL@ $(DESTDIR)@authdaemonrc@.dist || true
+ test -f $(DESTDIR)@authmysqlrc@.dist && @SYSCONFTOOL@ $(DESTDIR)@authmysqlrc@.dist || true
+ test -f $(DESTDIR)@authpgsqlrc@.dist && @SYSCONFTOOL@ $(DESTDIR)@authpgsqlrc@.dist || true
+ test -f $(DESTDIR)@authldaprc@.dist && @SYSCONFTOOL@ $(DESTDIR)@authldaprc@.dist || true
+
+# For maintainer's use only
+
+distrelease:
+ umask 022; $(MAKE) -$(MAKEFLAGS) distcheck
+ $(MAKE) -$(MAKEFLAGS) rpm
+ socksify cvs commit
+ socksify cvs tag -F @PACKAGE@-latest
+ $(MAKE) -$(MAKEFLAGS)
+ $(MAKE) -$(MAKEFLAGS)
+ rm -f @PACKAGE@.spec @PACKAGE@.lpspec
+ $(MAKE) -$(MAKEFLAGS) @PACKAGE@.spec @PACKAGE@.lpspec
+ $(MAKE) -$(MAKEFLAGS) dist
+
+tagrelease:
+ socksify cvs tag -F -r @PACKAGE@-latest \
+ `echo @PACKAGE@-@VERSION@ | tr '.' '-'`
+
+rpm: rpm-build
+
+rpm-build:
+ $(MAKE) -$(MAKEFLAGS) bump.rpm.release
+ $(MAKE) -$(MAKEFLAGS) dist
+ $(MAKE) -$(MAKEFLAGS) dorpm
+
+lpm: lpm-build
+
+lpm-build:
+ $(MAKE) -$(MAKEFLAGS) bump.rpm.release
+ $(MAKE) -$(MAKEFLAGS) dist
+ $(MAKE) -$(MAKEFLAGS) dolpm
+
+dolpm:
+ rm -rf lpm
+ mkdir lpm
+ lpbuild `test "@REPOSITORY@" == "" || echo --define "repository=1"` --srcbuild -o lpm @PACKAGE@-@VERSION@.tar.bz2
+
+publish: publish-@REPOSITORY@
+
+publish-dev:
+ $(MAKE) -$(MAKEFLAGS) dopublish SUBDIR=dev
+
+publish-prod:
+ $(MAKE) -$(MAKEFLAGS) dopublish SUBDIR=prod
+
+dopublish:
+ lpbuild --resign lpm/*
+ rm -rf lpmtmp
+ mkdir lpmtmp
+ ln lpm/* lpmtmp
+ rm -f lpmtmp/*debuginfo*
+ mv lpmtmp/*.src.lp repository-$(SUBDIR)/`lpm -q --distribution`/sources
+ mv lpmtmp/*.lp repository-$(SUBDIR)/`lpm -q --distribution`/packages
+ rm -rf lpmtmp
+ ls -t repository-$(SUBDIR)/`lpm -q --distribution`/sources | tail -n +6 | xargs -r -n 1 lpm --erase repository-$(SUBDIR)
+ lpm --sync repository-$(SUBDIR)
+ rsync -a -v --delete-after repository-$(SUBDIR)/`lpm -q --distribution`/. headache:lpmtool.com/www/repositories/$(SUBDIR)/courier-authlib/`lpm -q --distribution`
+
+dorpm:
+ rm -rf rpm/BUILD/*
+ rm -f rpm/RPMS/*/*
+ rm -f rpm/SOURCES/*
+ rm -f rpm/SPECS/*
+ rm -f rpm/SRPMS/*
+ unset MAKEFLAGS ; test ! -f $$HOME/.bashrc || . $$HOME/.bashrc; rpmbuild -ta --clean @PACKAGE@-@VERSION@.tar.bz2
+
+bump.rpm.release: @PACKAGE@.spec @PACKAGE@.lpspec
+ test -f $(srcdir)/rpm.release && . $(srcdir)/rpm.release; \
+ NEXT_RELEASE=0; \
+ test "$$VERSION" = "@VERSION@" && NEXT_RELEASE="$$RELEASE"; \
+ RELEASE=`expr $$NEXT_RELEASE + 1`; \
+ echo "VERSION=@VERSION@" >$(srcdir)/rpm.release; \
+ echo "RELEASE=$$RELEASE" >>$(srcdir)/rpm.release; \
+ sed 's/^Release: .*/Release: '$$RELEASE'%{courier_release}/' \
+ <@PACKAGE@.spec >@PACKAGE@.spec.new; \
+ mv @PACKAGE@.spec.new @PACKAGE@.spec; \
+ sed 's/^Release: .*/Release: '$$RELEASE'/' \
+ <@PACKAGE@.lpspec >@PACKAGE@.lpspec.new; \
+ mv @PACKAGE@.lpspec.new @PACKAGE@.lpspec
+
+upload-beta:
+ rm -f @PACKAGE@-@VERSION@.tar.bz2.sig; gpg --detach-sign --default-key mrsam@courier-mta.com @PACKAGE@-@VERSION@.tar.bz2; test -f @PACKAGE@-@VERSION@.tar.bz2.sig || exit 1
+ socksify ssh courier.sourceforge.net echo @PACKAGE@-@VERSION@.tar.bz2 `ls -l @PACKAGE@-@VERSION@.tar.bz2 | awk ' { print $$5 } '` \>/home/groups/c/co/courier/@PACKAGE@.beta
+ ssh headache 'cd torrents.courier-mta.org/pub/@PACKAGE@-dev && rm -rf @PACKAGE@-@VERSION@ && mkdir @PACKAGE@-@VERSION@ && echo seeder_args=--max_upload_rate 50 >@PACKAGE@-@VERSION@.info && ls -t | sed 1,6d | xargs rm -rf '
+ scp @PACKAGE@-@VERSION@.tar.bz2 @PACKAGE@-@VERSION@.tar.bz2.sig headache:torrents.courier-mta.org/pub/@PACKAGE@-dev/@PACKAGE@-@VERSION@
+
+upload-dist:
+ rm -f @PACKAGE@-@VERSION@.tar.bz2.sig; gpg --detach-sign --default-key mrsam@courier-mta.com @PACKAGE@-@VERSION@.tar.bz2; test -f @PACKAGE@-@VERSION@.tar.bz2.sig || exit 1
+ socksify cvs tag -F -r @PACKAGE@-latest \
+ `echo @PACKAGE@-@VERSION@ | tr '.' '-'`
+ socksify perl -e 'use Net::FTP; $$ftp=Net::FTP->new("upload.sourceforge.net.", Debug => 1, Passive => 1 ) || die; $$ftp->login("anonymous", "anonymous") || die; $$ftp->cwd("/incoming") && $$ftp->binary() && $$ftp->hash(1) && $$ftp->put("@PACKAGE@-@VERSION@.tar.bz2") && $$ftp->put("@PACKAGE@-@VERSION@.tar.bz2.sig") && exit 0; die;'
+ ssh headache 'cd torrents.courier-mta.org/pub/@PACKAGE@ && rm -rf @PACKAGE@-@VERSION@ && mkdir @PACKAGE@-@VERSION@ && echo seeder_args=--max_upload_rate 50 >@PACKAGE@-@VERSION@.info && ls -t | sed 1,6d | xargs rm -rf '
+ scp @PACKAGE@-@VERSION@.tar.bz2 @PACKAGE@-@VERSION@.tar.bz2.sig headache:torrents.courier-mta.org/pub/@PACKAGE@/@PACKAGE@-@VERSION@
+
+
+release-dist:
+ test -z "$(SFPASSWD)" && exit 1; exit 0
+ ./changelog.pl >changelog.txt
+ emacs releasenotes.txt
+ test -f releasenotes.txt || exit 1
+ socksify ../sftools/release.pl mrsam $(SFPASSWD) courier authlib @VERSION@ releasenotes.txt changelog.txt @PACKAGE@-@VERSION@.tar.bz2 @PACKAGE@-@VERSION@.tar.bz2.sig
+ socksify ssh courier.sourceforge.net rm -f /home/groups/c/co/courier/@PACKAGE@.beta
+
+HTMLDOCFILES=$(HTMLFILES) README.authdebug.html README_authlib.html \
+ $(man3:%.3=%.html) $(man1:%.1=%.html)
+
+htmldoc: $(HTMLDOCFILES)
+ for f in $^; do d=`basename $$f`; test "$$d" = "README.html" && d="index2.html"; xsltproc --nonet $(srcdir)/prep.xsl $$f | perl -ne 's~\$(id):.*\$$~\$(id):'"$$h"'\$$~; print' >html/$$d; done
--- /dev/null
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# $Id: Makefile.am,v 1.116 2007/04/01 00:13:35 mrsam Exp $
+#
+# Copyright 1998 - 2006 Double Precision, Inc. See COPYING for
+# distribution information.
+
+
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+sbin_PROGRAMS = authtest$(EXEEXT) authenumerate$(EXEEXT) \
+ authpasswd$(EXEEXT)
+bin_PROGRAMS = courierauthconfig$(EXEEXT)
+noinst_PROGRAMS = authdaemontest$(EXEEXT) authmksock$(EXEEXT) \
+ authdaemondprog$(EXEEXT)
+DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/README.authdebug.html.in $(srcdir)/authdaemond.in \
+ $(srcdir)/authdaemonrc.in $(srcdir)/authmigrate.in \
+ $(srcdir)/authsystem.passwd.in \
+ $(srcdir)/courier-authlib.lpspec.in \
+ $(srcdir)/courier-authlib.spec.in \
+ $(srcdir)/courier-authlib.sysvinit.in \
+ $(srcdir)/courier_auth_config.h.in $(srcdir)/dbobj.h.in \
+ $(srcdir)/userdb-test-cram-md5.pl.in $(top_srcdir)/configure \
+ AUTHORS COPYING ChangeLog INSTALL NEWS config.guess config.sub \
+ depcomp install-sh ltmain.sh missing
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = courier_auth_config.h
+CONFIG_CLEAN_FILES = authdaemond authdaemonrc authsystem.passwd \
+ README.authdebug.html dbobj.h authmigrate courier-authlib.spec \
+ courier-authlib.lpspec courier-authlib.sysvinit \
+ userdb-test-cram-md5.pl
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(pkglibexecdir)" \
+ "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" \
+ "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(includedir)"
+pkglibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+am__DEPENDENCIES_1 = libcourierauthcommon.la
+am_libauthcustom_la_OBJECTS = authcustom.lo preauthcustom.lo
+libauthcustom_la_OBJECTS = $(am_libauthcustom_la_OBJECTS)
+am_libauthldap_la_OBJECTS = authldap.lo preauthldap.lo authldaplib.lo
+libauthldap_la_OBJECTS = $(am_libauthldap_la_OBJECTS)
+am_libauthmysql_la_OBJECTS = authmysql.lo preauthmysql.lo \
+ authmysqllib.lo
+libauthmysql_la_OBJECTS = $(am_libauthmysql_la_OBJECTS)
+am_libauthpam_la_OBJECTS = authpam.lo preauthpam.lo
+libauthpam_la_OBJECTS = $(am_libauthpam_la_OBJECTS)
+am_libauthpgsql_la_OBJECTS = authpgsql.lo preauthpgsql.lo \
+ authpgsqllib.lo
+libauthpgsql_la_OBJECTS = $(am_libauthpgsql_la_OBJECTS)
+am_libauthpipe_la_OBJECTS = authpipe.lo authpipelib.lo
+libauthpipe_la_OBJECTS = $(am_libauthpipe_la_OBJECTS)
+am_libauthpwd_la_OBJECTS = authpwd.lo preauthpwd.lo
+libauthpwd_la_OBJECTS = $(am_libauthpwd_la_OBJECTS)
+am_libauthshadow_la_OBJECTS = authshadow.lo preauthshadow.lo
+libauthshadow_la_OBJECTS = $(am_libauthshadow_la_OBJECTS)
+am__DEPENDENCIES_2 = userdb/libuserdb.la
+am_libauthuserdb_la_OBJECTS = authuserdb.lo preauthuserdb.lo \
+ preauthuserdbcommon.lo authuserdbpwd.lo
+libauthuserdb_la_OBJECTS = $(am_libauthuserdb_la_OBJECTS)
+am_libauthvchkpw_la_OBJECTS = authvchkpw.lo authvchkpwlib.lo \
+ preauthvchkpw.lo
+libauthvchkpw_la_OBJECTS = $(am_libauthvchkpw_la_OBJECTS)
+libcourierauth_la_DEPENDENCIES = numlib/libnumlib.la \
+ random128/librandom128.la rfc822/libencode.la
+am_libcourierauth_la_OBJECTS = authdaemon.lo authdaemonlib.lo \
+ preauthdaemon.lo authmoduser2.lo authmoduser3.lo debug.lo \
+ authoption.lo
+libcourierauth_la_OBJECTS = $(am_libcourierauth_la_OBJECTS)
+am__libcourierauthcommon_la_SOURCES_DIST = auth.h courierauth.h \
+ authpwdenumerate.c authsaslfrombase64.c authsasltobase64.c \
+ authstaticlist.h authsyschangepwd.c authsyscommon.c cramlib.c \
+ cramlib.h checkpassword.c cryptpassword.c checkpasswordmd5.c \
+ checkpasswordsha1.c
+@HAVE_MD5_TRUE@am__objects_1 = checkpasswordmd5.lo
+@HAVE_SHA1_TRUE@am__objects_2 = checkpasswordsha1.lo
+am_libcourierauthcommon_la_OBJECTS = authpwdenumerate.lo \
+ authsaslfrombase64.lo authsasltobase64.lo authsyschangepwd.lo \
+ authsyscommon.lo cramlib.lo checkpassword.lo cryptpassword.lo \
+ $(am__objects_1) $(am__objects_2)
+libcourierauthcommon_la_OBJECTS = \
+ $(am_libcourierauthcommon_la_OBJECTS)
+libcourierauthsasl_la_DEPENDENCIES = libcourierauth.la
+am_libcourierauthsasl_la_OBJECTS = authsasl.lo authsaslcram.lo \
+ authsasllogin.lo authsaslplain.lo authsaslfrombase64.lo \
+ authsasltobase64.lo
+libcourierauthsasl_la_OBJECTS = $(am_libcourierauthsasl_la_OBJECTS)
+libcourierauthsaslclient_la_DEPENDENCIES = libcourierauth.la
+am_libcourierauthsaslclient_la_OBJECTS = authsaslclient.lo \
+ authsaslclientcram.lo authsaslclientcrammd5.lo \
+ authsaslclientcramsha1.lo authsaslclientlogin.lo \
+ authsaslclientplain.lo authsaslfrombase64.lo \
+ authsasltobase64.lo
+libcourierauthsaslclient_la_OBJECTS = \
+ $(am_libcourierauthsaslclient_la_OBJECTS)
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) $(sbin_PROGRAMS)
+am_authdaemondprog_OBJECTS = authdaemond.$(OBJEXT)
+authdaemondprog_OBJECTS = $(am_authdaemondprog_OBJECTS)
+am__DEPENDENCIES_3 =
+am_authdaemontest_OBJECTS = authdaemontest.$(OBJEXT)
+authdaemontest_OBJECTS = $(am_authdaemontest_OBJECTS)
+am_authenumerate_OBJECTS = authenumerate.$(OBJEXT)
+authenumerate_OBJECTS = $(am_authenumerate_OBJECTS)
+am_authmksock_OBJECTS = authmksock.$(OBJEXT)
+authmksock_OBJECTS = $(am_authmksock_OBJECTS)
+authmksock_DEPENDENCIES =
+am_authpasswd_OBJECTS = authpasswd.$(OBJEXT)
+authpasswd_OBJECTS = $(am_authpasswd_OBJECTS)
+authpasswd_DEPENDENCIES = libcourierauthcommon.la libhmac/libhmac.la \
+ md5/libmd5.la sha1/libsha1.la rfc822/libencode.la
+am_authtest_OBJECTS = authtest.$(OBJEXT)
+authtest_OBJECTS = $(am_authtest_OBJECTS)
+am_courierauthconfig_OBJECTS = authinfo.$(OBJEXT)
+courierauthconfig_OBJECTS = $(am_courierauthconfig_OBJECTS)
+courierauthconfig_LDADD = $(LDADD)
+pkglibexecSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+sbinSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(pkglibexec_SCRIPTS) $(sbin_SCRIPTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --quiet --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --quiet --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libauthcustom_la_SOURCES) $(libauthldap_la_SOURCES) \
+ $(libauthmysql_la_SOURCES) $(libauthpam_la_SOURCES) \
+ $(libauthpgsql_la_SOURCES) $(libauthpipe_la_SOURCES) \
+ $(libauthpwd_la_SOURCES) $(libauthshadow_la_SOURCES) \
+ $(libauthuserdb_la_SOURCES) $(libauthvchkpw_la_SOURCES) \
+ $(libcourierauth_la_SOURCES) \
+ $(libcourierauthcommon_la_SOURCES) \
+ $(libcourierauthsasl_la_SOURCES) \
+ $(libcourierauthsaslclient_la_SOURCES) \
+ $(authdaemondprog_SOURCES) $(authdaemontest_SOURCES) \
+ $(authenumerate_SOURCES) $(authmksock_SOURCES) \
+ $(authpasswd_SOURCES) $(authtest_SOURCES) \
+ $(courierauthconfig_SOURCES)
+DIST_SOURCES = $(libauthcustom_la_SOURCES) $(libauthldap_la_SOURCES) \
+ $(libauthmysql_la_SOURCES) $(libauthpam_la_SOURCES) \
+ $(libauthpgsql_la_SOURCES) $(libauthpipe_la_SOURCES) \
+ $(libauthpwd_la_SOURCES) $(libauthshadow_la_SOURCES) \
+ $(libauthuserdb_la_SOURCES) $(libauthvchkpw_la_SOURCES) \
+ $(libcourierauth_la_SOURCES) \
+ $(am__libcourierauthcommon_la_SOURCES_DIST) \
+ $(libcourierauthsasl_la_SOURCES) \
+ $(libcourierauthsaslclient_la_SOURCES) \
+ $(authdaemondprog_SOURCES) $(authdaemontest_SOURCES) \
+ $(authenumerate_SOURCES) $(authmksock_SOURCES) \
+ $(authpasswd_SOURCES) $(authtest_SOURCES) \
+ $(courierauthconfig_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+man1dir = $(mandir)/man1
+man3dir = $(mandir)/man3
+NROFF = nroff
+MANS = $(man_MANS)
+DATA = $(noinst_DATA)
+includeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTHPAMCRYPT = @AUTHPAMCRYPT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = srcdir=${srcdir} @SHELL@ ${srcdir}/automake.fix @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+COURIERCONFIG = @COURIERCONFIG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CRYPTLIBS = @CRYPTLIBS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DBSUBDIR = @DBSUBDIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXPECT = @EXPECT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+HAVE_AUTHMYSQL_FALSE = @HAVE_AUTHMYSQL_FALSE@
+HAVE_AUTHMYSQL_TRUE = @HAVE_AUTHMYSQL_TRUE@
+HAVE_AUTHPGSQL_FALSE = @HAVE_AUTHPGSQL_FALSE@
+HAVE_AUTHPGSQL_TRUE = @HAVE_AUTHPGSQL_TRUE@
+HAVE_CUSTOM_FALSE = @HAVE_CUSTOM_FALSE@
+HAVE_CUSTOM_TRUE = @HAVE_CUSTOM_TRUE@
+HAVE_HMACLIB_FALSE = @HAVE_HMACLIB_FALSE@
+HAVE_HMACLIB_TRUE = @HAVE_HMACLIB_TRUE@
+HAVE_LDAP_FALSE = @HAVE_LDAP_FALSE@
+HAVE_LDAP_TRUE = @HAVE_LDAP_TRUE@
+HAVE_MD5_FALSE = @HAVE_MD5_FALSE@
+HAVE_MD5_TRUE = @HAVE_MD5_TRUE@
+HAVE_PIPE_FALSE = @HAVE_PIPE_FALSE@
+HAVE_PIPE_TRUE = @HAVE_PIPE_TRUE@
+HAVE_SGML_FALSE = @HAVE_SGML_FALSE@
+HAVE_SGML_TRUE = @HAVE_SGML_TRUE@
+HAVE_SHA1_FALSE = @HAVE_SHA1_FALSE@
+HAVE_SHA1_TRUE = @HAVE_SHA1_TRUE@
+HMACLIB = @HMACLIB@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDAPLIBS = @LDAPLIBS@
+LDFLAGS = @LDFLAGS@
+LIBAUTHCUSTOM = @LIBAUTHCUSTOM@
+LIBAUTHLDAP = @LIBAUTHLDAP@
+LIBAUTHMYSQL = @LIBAUTHMYSQL@
+LIBAUTHPAM = @LIBAUTHPAM@
+LIBAUTHPGSQL = @LIBAUTHPGSQL@
+LIBAUTHPIPE = @LIBAUTHPIPE@
+LIBAUTHPWD = @LIBAUTHPWD@
+LIBAUTHSHADOW = @LIBAUTHSHADOW@
+LIBAUTHUSERDB = @LIBAUTHUSERDB@
+LIBAUTHVCHKPW = @LIBAUTHVCHKPW@
+LIBDB = @LIBDB@
+LIBDL = @LIBDL@
+LIBGDBM = @LIBGDBM@
+LIBLTDL = @LIBLTDL@
+LIBLTDL_SUBDIR = @LIBLTDL_SUBDIR@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTDLINCL = @LTDLINCL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5LIB = @MD5LIB@
+MYSQL_CONFIG = @MYSQL_CONFIG@
+MYSQL_LIBS = @MYSQL_LIBS@
+NETLIBS = @NETLIBS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PASSWD = @PASSWD@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PGSQL_LIBS = @PGSQL_LIBS@
+PG_CONFIG = @PG_CONFIG@
+RANLIB = @RANLIB@
+REPOSITORY = @REPOSITORY@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHA1LIB = @SHA1LIB@
+SHADOWLIBS = @SHADOWLIBS@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SYSCONFTOOL = @SYSCONFTOOL@
+SYSCONFTOOL_PERL = @SYSCONFTOOL_PERL@
+USE_DB = @USE_DB@
+USE_GDBM = @USE_GDBM@
+VERSION = @VERSION@
+VPOPMAILLIBS = @VPOPMAILLIBS@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+authProg = @authProg@
+authdaemonrc = @authdaemonrc@
+authdaemonvar = @authdaemonvar@
+authldaprc = @authldaprc@
+authmysqlrc = @authmysqlrc@
+authpgsqlrc = @authpgsqlrc@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+dblibrary = @dblibrary@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mailgroup = @mailgroup@
+mailuser = @mailuser@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+userdb = @userdb@
+vpopmail_home = @vpopmail_home@
+AUTOMAKE_OPTIONS = dist-bzip2
+SUBDIRS = @LIBLTDL_SUBDIR@ @DBSUBDIR@ md5 sha1 libhmac numlib makedat userdb rfc822 random128 liblock liblog
+DIST_SUBDIRS = libltdl gdbmobj bdbobj md5 sha1 libhmac numlib makedat userdb rfc822 random128 liblock liblog
+INCLUDES = $(LTDLINCL)
+modules = @LIBAUTHUSERDB@ \
+ @LIBAUTHPAM@ @LIBAUTHPWD@ @LIBAUTHSHADOW@ \
+ @LIBAUTHPGSQL@ @LIBAUTHLDAP@ @LIBAUTHMYSQL@ \
+ @LIBAUTHCUSTOM@ @LIBAUTHVCHKPW@ @LIBAUTHPIPE@
+
+pkglibexecdir = $(libexecdir)/courier-authlib
+pkglibexec_SCRIPTS = authsystem.passwd
+pkglib_LTLIBRARIES = libcourierauth.la \
+ libcourierauthsasl.la libcourierauthsaslclient.la \
+ libcourierauthcommon.la $(modules)
+
+sbin_SCRIPTS = authdaemond
+EXTRA_LTLIBRARIES = libauthuserdb.la \
+ libauthpam.la libauthpwd.la libauthshadow.la \
+ libauthvchkpw.la \
+ libauthpgsql.la \
+ libauthldap.la \
+ libauthmysql.la \
+ libauthcustom.la \
+ libauthpipe.la
+
+CLEANFILES = authldaprc.h authmysqlrc.h authdaemonrc.h vpopmail_config.h \
+ authpgsqlrc.h authpiperc.h authdaemon \
+ authlib.3 authlib.html packageversion.h \
+ authchangepwdir.h sbindir.h pkglibdir.h pkgincludedir.h \
+ mailusergroup.h authinfodaemondlist.c permissions.dat \
+ README.authdebug.html
+
+DISTCLEANFILES = dbobj.config README_authlib.html
+commonlibdep = libcourierauthcommon.la
+commonldflags = -module -rpath $(pkglibdir) -export-symbols-regex 'courier_auth.*_init'
+commonlibadd = libcourierauthcommon.la
+libcourierauthcommon_t = @CRYPTLIBS@
+libcourierauthcommon_la_SOURCES = \
+ auth.h courierauth.h \
+ authpwdenumerate.c \
+ authsaslfrombase64.c authsasltobase64.c \
+ authstaticlist.h \
+ authsyschangepwd.c authsyscommon.c \
+ cramlib.c cramlib.h \
+ checkpassword.c cryptpassword.c \
+ $(checkpasswordmd5c) $(checkpasswordsha1c)
+
+libcourierauthcommon_la_DEPENDENCIES = libcourierauth.la
+libcourierauthcommon_la_LIBADD = libcourierauth.la
+libcourierauthcommon_la_LDFLAGS = $(libcourierauthcommon_t:%=-Wl,%)
+libcourierauth_la_SOURCES = authdaemon.c authdaemonlib.c preauthdaemon.c \
+ authmoduser2.c authmoduser3.c debug.c \
+ courierauthdebug.h \
+ authoption.c
+
+libcourierauth_la_LIBADD = @HMACLIB@ @MD5LIB@ @SHA1LIB@ numlib/libnumlib.la \
+ random128/librandom128.la rfc822/libencode.la
+
+libcourierauth_la_LDFLAGS = @NETLIBS@
+
+# The userdb module
+libauthuserdb_t = userdb/libuserdb.la @dblibrary@ @LIBGDBM@ @LIBDB@
+libauthuserdb_la_SOURCES = authuserdb.c preauthuserdb.c preauthuserdbcommon.c \
+ authuserdbpwd.c
+
+libauthuserdb_la_DEPENDENCIES = libcourierauthcommon.la @dblibrary@
+libauthuserdb_la_LIBADD = $(commonlibadd) $(libauthuserdb_t)
+libauthuserdb_la_LDFLAGS = $(commonldflags)
+
+# the authpam module
+libauthpam_t = -lpam @SHADOWLIBS@ @AUTHPAMCRYPT@ @LIBDL@
+libauthpam_la_SOURCES = authpam.c preauthpam.c authwait.h
+libauthpam_la_DEPENDENCIES = $(commonlibdep)
+libauthpam_la_LIBADD = $(commonlibadd)
+libauthpam_la_LDFLAGS = $(commonldflags) $(libauthpam_t)
+
+# The authpwd module
+libauthpwd_la_SOURCES = authpwd.c preauthpwd.c
+libauthpwd_la_DEPENDENCIES = $(commonlibdep)
+libauthpwd_la_LIBADD = $(commonlibadd)
+libauthpwd_la_LDFLAGS = $(commonldflags)
+
+# The authshadow module
+libauthshadow_t = @SHADOWLIBS@
+libauthshadow_la_SOURCES = authshadow.c preauthshadow.c
+libauthshadow_la_DEPENDENCIES = $(commonlibdep)
+libauthshadow_la_LIBADD = $(commonlibadd)
+libauthshadow_la_LDFLAGS = $(commonldflags) $(libauthshadow_t)
+
+# The authvchkpw module
+libauthvchkpw_t = @VPOPMAILLIBS@ @LIBM@
+libauthvchkpw_la_SOURCES = authvchkpw.c authvchkpwlib.c preauthvchkpw.c
+libauthvchkpw_la_DEPENDENCIES = $(commonlibdep)
+libauthvchkpw_la_LIBADD = $(commonlibadd)
+libauthvchkpw_la_LDFLAGS = $(commonldflags) $(libauthvchkpw_t)
+
+# The authpgsql module
+libauthpgsql_t = @PGSQL_LIBS@ @LIBM@ @NETLIBS@
+libauthpgsql_la_SOURCES = authpgsql.c preauthpgsql.c authpgsqllib.c authpgsql.h
+libauthpgsql_la_DEPENDENCIES = $(commonlibdep)
+libauthpgsql_la_LIBADD = $(commonlibadd)
+libauthpgsql_la_LDFLAGS = $(commonldflags) $(libauthpgsql_t)
+
+# The authldap module
+libauthldap_t = @LDAPLIBS@ @NETLIBS@
+libauthldap_la_SOURCES = authldap.c preauthldap.c authldaplib.c authldap.h
+libauthldap_la_DEPENDENCIES = $(commonlibdep)
+libauthldap_la_LIBADD = $(commonlibadd)
+libauthldap_la_LDFLAGS = $(commonldflags) $(libauthldap_t)
+
+# The authmysql module
+libauthmysql_t = @MYSQL_LIBS@ @LIBM@ @NETLIBS@
+libauthmysql_la_SOURCES = authmysql.c preauthmysql.c authmysqllib.c authmysql.h
+libauthmysql_la_DEPENDENCIES = $(commonlibdep)
+libauthmysql_la_LIBADD = $(commonlibadd)
+libauthmysql_la_LDFLAGS = $(commonldflags) $(libauthmysql_t)
+
+# The authcustom module
+libauthcustom_la_SOURCES = authcustom.c preauthcustom.c authcustom.h
+libauthcustom_la_DEPENDENCIES = $(commonlibdep)
+libauthcustom_la_LIBADD = $(commonlibadd)
+libauthcustom_la_LDFLAGS = $(commonldflags)
+
+# The authpipe module
+libauthpipe_la_SOURCES = authpipe.c authpipelib.h authpipelib.c
+libauthpipe_la_DEPENDENCIES = $(commonlibdep)
+libauthpipe_la_LIBADD = $(commonlibadd)
+libauthpipe_la_LDFLAGS = $(commonldflags)
+@HAVE_MD5_FALSE@checkpasswordmd5c =
+@HAVE_MD5_TRUE@checkpasswordmd5c = checkpasswordmd5.c
+@HAVE_SHA1_FALSE@checkpasswordsha1c =
+@HAVE_SHA1_TRUE@checkpasswordsha1c = checkpasswordsha1.c
+HTMLFILES = README.html NEWS.html INSTALL.html \
+ README.authmysql.html README.authpostgres.html
+
+EXTRA_DIST = $(HTMLFILES) sysconftool COPYING COPYING.GPL\
+ authldap.schema \
+ checkpasswordmd5.c checkpasswordsha1.c \
+ authldaprc authmysqlrc authpgsqlrc README.ldap \
+ README.authmysql.myownquery \
+ README.authdebug.html.in automake.fix \
+ courier-authlib.spec \
+ courier-authlib.lpspec pgpkeys.txt \
+ README_authlib.html.in \
+ authlib.html.in authlib.3.in \
+ authpasswd.html authpasswd.1 \
+ authtest.html authtest.1 \
+ auth_sasl.html auth_sasl.3 \
+ auth_generic.html auth_generic.3 \
+ auth_login.html auth_login.3 \
+ auth_passwd.html auth_passwd.3 \
+ auth_getuserinfo.html auth_getuserinfo.3 \
+ auth_enumerate.html auth_enumerate.3 \
+ auth_getoption.html auth_getoption.3 \
+ samplepipe.pl prep.xsl
+
+libcourierauthsasl_la_SOURCES = \
+ authsasl.c courierauthsasl.h \
+ authsaslcram.c authsasllogin.c authsaslplain.c \
+ authsaslfrombase64.c authsasltobase64.c
+
+libcourierauthsasl_la_LIBADD = libcourierauth.la
+libcourierauthsasl_la_LDFLAGS = -export-symbols-regex '^auth_sasl$$'
+libcourierauthsaslclient_la_SOURCES = courierauthsaslclient.h \
+ authsaslclient.c authsaslclient.h authsaslclientcram.c \
+ authsaslclientcrammd5.c authsaslclientcramsha1.c \
+ authsaslclientlogin.c authsaslclientplain.c \
+ authsaslfrombase64.c authsasltobase64.c
+
+libcourierauthsaslclient_la_LIBADD = libcourierauth.la
+libcourierauthsaslclient_la_LDFLAGS = -export-symbols-regex '^auth_sasl_client$$'
+include_HEADERS = courier_auth_config.h courierauth.h courierauthsasl.h \
+ courierauthsaslclient.h courierauthdebug.h
+
+courierauthconfig_SOURCES = authinfo.c
+authpasswd_SOURCES = authpasswd.c
+authpasswd_LDADD = libcourierauthcommon.la \
+ libhmac/libhmac.la md5/libmd5.la sha1/libsha1.la rfc822/libencode.la
+
+authtest_SOURCES = authtest.c
+authtest_DEPENDENCIES = libcourierauth.la
+authtest_LDADD = libcourierauth.la
+authenumerate_SOURCES = authenumerate.c
+authenumerate_DEPENDENCIES = libcourierauth.la \
+ numlib/libnumlib.la
+
+authenumerate_LDADD = libcourierauth.la \
+ numlib/libnumlib.la
+
+authenumerate_LDFLAGS =
+
+#
+# The main daemon.
+authdaemondprog_SOURCES = authdaemond.c
+authdaemondprog_DEPENDENCIES = libcourierauthcommon.la \
+ liblock/liblock.la $(modules) \
+ libhmac/libhmac.la md5/libmd5.la sha1/libsha1.la \
+ rfc822/libencode.la numlib/libnumlib.la
+
+authdaemondprog_LDADD = $(LIBLTDL) libcourierauthcommon.la liblock/liblock.la \
+ libhmac/libhmac.la md5/libmd5.la sha1/libsha1.la \
+ rfc822/libencode.la numlib/libnumlib.la
+
+authdaemondprog_LDFLAGS = -export-dynamic $(modules:%=-dlopen %) @NETLIBS@
+authdaemontest_SOURCES = authdaemontest.c
+authdaemontest_DEPENDENCIES = libcourierauthcommon.la
+authdaemontest_LDADD = libcourierauthcommon.la @NETLIBS@
+authdaemontest_LDFLAGS = -static
+authmksock_SOURCES = authmksock.c
+authmksock_LDADD = @NETLIBS@
+man3 = authlib.3 auth_generic.3 auth_login.3 auth_getuserinfo.3 \
+ auth_enumerate.3 auth_passwd.3 auth_getoption.3 auth_sasl.3
+
+man1 = authpasswd.1 authtest.1
+man_MANS = $(man1) $(man3)
+BUILT1 = authlib.html authldaprc.h authmysqlrc.h authpgsqlrc.h authpiperc.h \
+ authdaemonrc.h vpopmail_config.h packageversion.h \
+ authchangepwdir.h sbindir.h \
+ pkglibdir.h pkgincludedir.h mailusergroup.h \
+ README_authlib.html
+
+BUILT_SOURCES = $(BUILT1) $(man3:%.3=%.html) $(man1:%.1=%.html)
+noinst_DATA = $(BUILT_SOURCES)
+HTMLDOCFILES = $(HTMLFILES) README.authdebug.html README_authlib.html \
+ $(man3:%.3=%.html) $(man1:%.1=%.html)
+
+all: $(BUILT_SOURCES) courier_auth_config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+ cd $(srcdir) && $(AUTOMAKE) --gnu \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+courier_auth_config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) stamp-h1; \
+ else :; fi
+
+stamp-h1: $(srcdir)/courier_auth_config.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status courier_auth_config.h
+$(srcdir)/courier_auth_config.h.in: $(am__configure_deps)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f courier_auth_config.h stamp-h1
+authdaemond: $(top_builddir)/config.status $(srcdir)/authdaemond.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+authdaemonrc: $(top_builddir)/config.status $(srcdir)/authdaemonrc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+authsystem.passwd: $(top_builddir)/config.status $(srcdir)/authsystem.passwd.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+README.authdebug.html: $(top_builddir)/config.status $(srcdir)/README.authdebug.html.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+dbobj.h: $(top_builddir)/config.status $(srcdir)/dbobj.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+authmigrate: $(top_builddir)/config.status $(srcdir)/authmigrate.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+courier-authlib.spec: $(top_builddir)/config.status $(srcdir)/courier-authlib.spec.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+courier-authlib.lpspec: $(top_builddir)/config.status $(srcdir)/courier-authlib.lpspec.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+courier-authlib.sysvinit: $(top_builddir)/config.status $(srcdir)/courier-authlib.sysvinit.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+userdb-test-cram-md5.pl: $(top_builddir)/config.status $(srcdir)/userdb-test-cram-md5.pl.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-pkglibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+ done
+
+clean-pkglibLTLIBRARIES:
+ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libauthcustom.la: $(libauthcustom_la_OBJECTS) $(libauthcustom_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) $(libauthcustom_la_LDFLAGS) $(libauthcustom_la_OBJECTS) $(libauthcustom_la_LIBADD) $(LIBS)
+libauthldap.la: $(libauthldap_la_OBJECTS) $(libauthldap_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) $(libauthldap_la_LDFLAGS) $(libauthldap_la_OBJECTS) $(libauthldap_la_LIBADD) $(LIBS)
+libauthmysql.la: $(libauthmysql_la_OBJECTS) $(libauthmysql_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) $(libauthmysql_la_LDFLAGS) $(libauthmysql_la_OBJECTS) $(libauthmysql_la_LIBADD) $(LIBS)
+libauthpam.la: $(libauthpam_la_OBJECTS) $(libauthpam_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) $(libauthpam_la_LDFLAGS) $(libauthpam_la_OBJECTS) $(libauthpam_la_LIBADD) $(LIBS)
+libauthpgsql.la: $(libauthpgsql_la_OBJECTS) $(libauthpgsql_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) $(libauthpgsql_la_LDFLAGS) $(libauthpgsql_la_OBJECTS) $(libauthpgsql_la_LIBADD) $(LIBS)
+libauthpipe.la: $(libauthpipe_la_OBJECTS) $(libauthpipe_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) $(libauthpipe_la_LDFLAGS) $(libauthpipe_la_OBJECTS) $(libauthpipe_la_LIBADD) $(LIBS)
+libauthpwd.la: $(libauthpwd_la_OBJECTS) $(libauthpwd_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) $(libauthpwd_la_LDFLAGS) $(libauthpwd_la_OBJECTS) $(libauthpwd_la_LIBADD) $(LIBS)
+libauthshadow.la: $(libauthshadow_la_OBJECTS) $(libauthshadow_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) $(libauthshadow_la_LDFLAGS) $(libauthshadow_la_OBJECTS) $(libauthshadow_la_LIBADD) $(LIBS)
+libauthuserdb.la: $(libauthuserdb_la_OBJECTS) $(libauthuserdb_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) $(libauthuserdb_la_LDFLAGS) $(libauthuserdb_la_OBJECTS) $(libauthuserdb_la_LIBADD) $(LIBS)
+libauthvchkpw.la: $(libauthvchkpw_la_OBJECTS) $(libauthvchkpw_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) $(libauthvchkpw_la_LDFLAGS) $(libauthvchkpw_la_OBJECTS) $(libauthvchkpw_la_LIBADD) $(LIBS)
+libcourierauth.la: $(libcourierauth_la_OBJECTS) $(libcourierauth_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) -rpath $(pkglibdir) $(libcourierauth_la_LDFLAGS) $(libcourierauth_la_OBJECTS) $(libcourierauth_la_LIBADD) $(LIBS)
+libcourierauthcommon.la: $(libcourierauthcommon_la_OBJECTS) $(libcourierauthcommon_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) -rpath $(pkglibdir) $(libcourierauthcommon_la_LDFLAGS) $(libcourierauthcommon_la_OBJECTS) $(libcourierauthcommon_la_LIBADD) $(LIBS)
+libcourierauthsasl.la: $(libcourierauthsasl_la_OBJECTS) $(libcourierauthsasl_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) -rpath $(pkglibdir) $(libcourierauthsasl_la_LDFLAGS) $(libcourierauthsasl_la_OBJECTS) $(libcourierauthsasl_la_LIBADD) $(LIBS)
+libcourierauthsaslclient.la: $(libcourierauthsaslclient_la_OBJECTS) $(libcourierauthsaslclient_la_DEPENDENCIES)
+ @echo Linking $@; $(LINK) -rpath $(pkglibdir) $(libcourierauthsaslclient_la_LDFLAGS) $(libcourierauthsaslclient_la_OBJECTS) $(libcourierauthsaslclient_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+
+clean-noinstPROGRAMS:
+ @list='$(noinst_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)"
+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-sbinPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+ done
+
+clean-sbinPROGRAMS:
+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+authdaemondprog$(EXEEXT): $(authdaemondprog_OBJECTS) $(authdaemondprog_DEPENDENCIES)
+ @rm -f authdaemondprog$(EXEEXT)
+ @echo Linking $@; $(LINK) $(authdaemondprog_LDFLAGS) $(authdaemondprog_OBJECTS) $(authdaemondprog_LDADD) $(LIBS)
+authdaemontest$(EXEEXT): $(authdaemontest_OBJECTS) $(authdaemontest_DEPENDENCIES)
+ @rm -f authdaemontest$(EXEEXT)
+ @echo Linking $@; $(LINK) $(authdaemontest_LDFLAGS) $(authdaemontest_OBJECTS) $(authdaemontest_LDADD) $(LIBS)
+authenumerate$(EXEEXT): $(authenumerate_OBJECTS) $(authenumerate_DEPENDENCIES)
+ @rm -f authenumerate$(EXEEXT)
+ @echo Linking $@; $(LINK) $(authenumerate_LDFLAGS) $(authenumerate_OBJECTS) $(authenumerate_LDADD) $(LIBS)
+authmksock$(EXEEXT): $(authmksock_OBJECTS) $(authmksock_DEPENDENCIES)
+ @rm -f authmksock$(EXEEXT)
+ @echo Linking $@; $(LINK) $(authmksock_LDFLAGS) $(authmksock_OBJECTS) $(authmksock_LDADD) $(LIBS)
+authpasswd$(EXEEXT): $(authpasswd_OBJECTS) $(authpasswd_DEPENDENCIES)
+ @rm -f authpasswd$(EXEEXT)
+ @echo Linking $@; $(LINK) $(authpasswd_LDFLAGS) $(authpasswd_OBJECTS) $(authpasswd_LDADD) $(LIBS)
+authtest$(EXEEXT): $(authtest_OBJECTS) $(authtest_DEPENDENCIES)
+ @rm -f authtest$(EXEEXT)
+ @echo Linking $@; $(LINK) $(authtest_LDFLAGS) $(authtest_OBJECTS) $(authtest_LDADD) $(LIBS)
+courierauthconfig$(EXEEXT): $(courierauthconfig_OBJECTS) $(courierauthconfig_DEPENDENCIES)
+ @rm -f courierauthconfig$(EXEEXT)
+ @echo Linking $@; $(LINK) $(courierauthconfig_LDFLAGS) $(courierauthconfig_OBJECTS) $(courierauthconfig_LDADD) $(LIBS)
+install-pkglibexecSCRIPTS: $(pkglibexec_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibexecdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibexecdir)"
+ @list='$(pkglibexec_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(pkglibexecSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibexecdir)/$$f'"; \
+ $(pkglibexecSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibexecdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-pkglibexecSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglibexec_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(pkglibexecdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkglibexecdir)/$$f"; \
+ done
+install-sbinSCRIPTS: $(sbin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)"
+ @list='$(sbin_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(sbinSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+ $(sbinSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(sbindir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-sbinSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(sbin_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+ done
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authcustom.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authdaemon.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authdaemond.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authdaemonlib.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authdaemontest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authenumerate.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authinfo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authldap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authldaplib.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authmksock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authmoduser2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authmoduser3.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authmysql.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authmysqllib.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authoption.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authpam.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authpasswd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authpgsql.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authpgsqllib.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authpipe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authpipelib.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authpwd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authpwdenumerate.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsasl.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsaslclient.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsaslclientcram.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsaslclientcrammd5.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsaslclientcramsha1.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsaslclientlogin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsaslclientplain.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsaslcram.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsaslfrombase64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsasllogin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsaslplain.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsasltobase64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authshadow.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsyschangepwd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authsyscommon.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authtest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authuserdb.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authuserdbpwd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authvchkpw.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authvchkpwlib.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checkpassword.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checkpasswordmd5.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checkpasswordsha1.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cramlib.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cryptpassword.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preauthcustom.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preauthdaemon.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preauthldap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preauthmysql.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preauthpam.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preauthpgsql.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preauthpwd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preauthshadow.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preauthuserdb.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preauthuserdbcommon.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preauthvchkpw.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ @echo Compiling $< ; if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ @echo Compiling $< ; if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ @echo Compiling $< ; if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+install-man3: $(man3_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man3dir)" || $(mkdir_p) "$(DESTDIR)$(man3dir)"
+ @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.3*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 3*) ;; \
+ *) ext='3' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \
+ done
+uninstall-man3:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.3*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 3*) ;; \
+ *) ext='3' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man3dir)/$$inst"; \
+ done
+install-includeHEADERS: $(include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
+ @list='$(include_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
+ $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
+ done
+
+uninstall-includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(include_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(includedir)/$$f"; \
+ done
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) courier_auth_config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) courier_auth_config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) courier_auth_config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) courier_auth_config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/.
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) \
+ $(HEADERS) courier_auth_config.h
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(pkglibexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(includedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+ clean-noinstPROGRAMS clean-pkglibLTLIBRARIES \
+ clean-sbinPROGRAMS mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-includeHEADERS install-man
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) install-data-hook
+
+install-exec-am: install-binPROGRAMS install-pkglibLTLIBRARIES \
+ install-pkglibexecSCRIPTS install-sbinPROGRAMS \
+ install-sbinSCRIPTS
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) install-exec-hook
+
+install-info: install-info-recursive
+
+install-man: install-man1 install-man3
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \
+ uninstall-info-am uninstall-man uninstall-pkglibLTLIBRARIES \
+ uninstall-pkglibexecSCRIPTS uninstall-sbinPROGRAMS \
+ uninstall-sbinSCRIPTS
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook
+
+uninstall-info: uninstall-info-recursive
+
+uninstall-man: uninstall-man1 uninstall-man3
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-am clean clean-binPROGRAMS clean-generic clean-libtool \
+ clean-noinstPROGRAMS clean-pkglibLTLIBRARIES clean-recursive \
+ clean-sbinPROGRAMS ctags ctags-recursive dist dist-all \
+ dist-bzip2 dist-gzip dist-hook dist-shar dist-tarZ dist-zip \
+ distcheck distclean distclean-compile distclean-generic \
+ distclean-hdr distclean-libtool distclean-recursive \
+ distclean-tags distcleancheck distdir distuninstallcheck dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-binPROGRAMS install-data install-data-am \
+ install-data-hook install-exec install-exec-am \
+ install-exec-hook install-includeHEADERS install-info \
+ install-info-am install-man install-man1 install-man3 \
+ install-pkglibLTLIBRARIES install-pkglibexecSCRIPTS \
+ install-sbinPROGRAMS install-sbinSCRIPTS install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
+ pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-hook uninstall-includeHEADERS \
+ uninstall-info-am uninstall-man uninstall-man1 uninstall-man3 \
+ uninstall-pkglibLTLIBRARIES uninstall-pkglibexecSCRIPTS \
+ uninstall-sbinPROGRAMS uninstall-sbinSCRIPTS
+
+
+authvchkpw.lo: authvchkpw.c vpopmail_config.h
+preauthvchkpw.lo: preauthvchkpw.c vpopmail_config.h
+
+vpopmail_config.h:
+ echo '#include "@vpopmail_home@/include/config.h"' >vpopmail_config.h
+
+authpgsqllib.lo: authpgsqllib.c authpgsqlrc.h
+
+@HAVE_AUTHPGSQL_TRUE@install-authpgsqlrc:
+@HAVE_AUTHPGSQL_TRUE@ $(mkinstalldirs) $(DESTDIR)`dirname @authpgsqlrc@` || :
+@HAVE_AUTHPGSQL_TRUE@ $(INSTALL_DATA) -m 660 $(srcdir)/authpgsqlrc \
+@HAVE_AUTHPGSQL_TRUE@ $(DESTDIR)@authpgsqlrc@.dist
+@HAVE_AUTHPGSQL_TRUE@ -chown @mailuser@ $(DESTDIR)@authpgsqlrc@.dist
+@HAVE_AUTHPGSQL_TRUE@ -chgrp @mailgroup@ $(DESTDIR)@authpgsqlrc@.dist
+
+@HAVE_AUTHPGSQL_TRUE@uninstall-authpgsqlrc:
+@HAVE_AUTHPGSQL_TRUE@ rm -f $(DESTDIR)@authpgsqlrc@.dist
+
+@HAVE_AUTHPGSQL_FALSE@install-authpgsqlrc:
+@HAVE_AUTHPGSQL_FALSE@ @:
+
+@HAVE_AUTHPGSQL_FALSE@uninstall-authpgsqlrc:
+@HAVE_AUTHPGSQL_FALSE@ @:
+
+authpgsqlrc.h:
+ echo "#define AUTHPGSQLRC \"@authpgsqlrc@\"" >authpgsqlrc.h
+
+authldaplib.lo: authldaplib.c authldaprc.h
+
+@HAVE_LDAP_TRUE@install-authldaprc:
+@HAVE_LDAP_TRUE@ $(mkinstalldirs) $(DESTDIR)`dirname @authldaprc@` || :
+@HAVE_LDAP_TRUE@ $(INSTALL_DATA) -m 660 $(srcdir)/authldaprc \
+@HAVE_LDAP_TRUE@ $(DESTDIR)@authldaprc@.dist
+@HAVE_LDAP_TRUE@ -chown @mailuser@ $(DESTDIR)@authldaprc@.dist
+@HAVE_LDAP_TRUE@ -chgrp @mailgroup@ $(DESTDIR)@authldaprc@.dist
+
+@HAVE_LDAP_TRUE@uninstall-authldaprc:
+@HAVE_LDAP_TRUE@ rm -f $(DESTDIR)@authldaprc@.dist
+
+@HAVE_LDAP_FALSE@install-authldaprc:
+@HAVE_LDAP_FALSE@ @:
+
+@HAVE_LDAP_FALSE@uninstall-authldaprc:
+@HAVE_LDAP_FALSE@ @:
+
+authldaprc.h:
+ echo "#define AUTHLDAPRC \"@authldaprc@\"" >authldaprc.h
+
+authmysqllib.lo: authmysqllib.c authmysqlrc.h
+
+@HAVE_AUTHMYSQL_TRUE@install-authmysqlrc:
+@HAVE_AUTHMYSQL_TRUE@ $(mkinstalldirs) $(DESTDIR)`dirname @authmysqlrc@` || :
+@HAVE_AUTHMYSQL_TRUE@ $(INSTALL_DATA) -m 660 $(srcdir)/authmysqlrc \
+@HAVE_AUTHMYSQL_TRUE@ $(DESTDIR)@authmysqlrc@.dist
+@HAVE_AUTHMYSQL_TRUE@ -chown @mailuser@ $(DESTDIR)@authmysqlrc@.dist
+@HAVE_AUTHMYSQL_TRUE@ -chgrp @mailgroup@ $(DESTDIR)@authmysqlrc@.dist
+
+@HAVE_AUTHMYSQL_TRUE@uninstall-authmysqlrc:
+@HAVE_AUTHMYSQL_TRUE@ rm -f $(DESTDIR)@authmysqlrc@.dist
+
+@HAVE_AUTHMYSQL_FALSE@install-authmysqlrc:
+@HAVE_AUTHMYSQL_FALSE@ @:
+
+@HAVE_AUTHMYSQL_FALSE@uninstall-authmysqlrc:
+@HAVE_AUTHMYSQL_FALSE@ @:
+
+authmysqlrc.h:
+ echo "#define AUTHMYSQLRC \"@authmysqlrc@\"" >authmysqlrc.h
+
+authpipelib.lo: authpipelib.c authpipelib.h authpiperc.h
+
+authpiperc.h:
+ echo "#define PIPE_PROGRAM \"@authProg@\"" >authpiperc.h
+
+install-authdaemonrc:
+ $(mkinstalldirs) $(DESTDIR)`dirname @authdaemonrc@` || :
+ sed 's/@ALLMODULES@/$(modules:lib%.la=%)/' <authdaemonrc >authdaemonrc.tmp
+ $(INSTALL_DATA) -m 660 authdaemonrc.tmp $(DESTDIR)@authdaemonrc@.dist
+ rm -f authdaemonrc.tmp
+ -chown @mailuser@ $(DESTDIR)@authdaemonrc@.dist
+ -chgrp @mailgroup@ $(DESTDIR)@authdaemonrc@.dist
+
+uninstall-authdaemonrc:
+ rm -f $(DESTDIR)@authdaemonrc@.dist
+
+authdaemonrc.h:
+ echo "#define AUTHDAEMONRC \"@authdaemonrc@\"" >authdaemonrc.h
+ echo "#define AUTHDAEMONVAR \"@authdaemonvar@\"" >>authdaemonrc.h
+ echo "#define AUTHDAEMONPID AUTHDAEMONVAR \"/pid\"" >>authdaemonrc.h
+ echo "#define AUTHDAEMONSOCK AUTHDAEMONVAR \"/socket\"" >>authdaemonrc.h
+ echo "#define AUTHDAEMONLOCK AUTHDAEMONVAR \"/lock\"" >>authdaemonrc.h
+
+README: README.html
+ links -dump README.html >README
+
+NEWS: NEWS.html
+ links -dump NEWS.html >NEWS
+
+INSTALL: INSTALL.html
+ links -dump INSTALL.html >INSTALL
+
+authchangepwdir.h: config.status
+ echo '#define AUTHCHANGEPWDIR "$(pkglibexecdir)"' >authchangepwdir.h
+
+sbindir.h: config.status
+ echo '#define SBINDIR "@sbindir@"' >sbindir.h
+
+pkglibdir.h: config.status
+ echo '#define PKGLIBDIR "$(pkglibdir)"' >pkglibdir.h
+
+packageversion.h: config.status
+ echo '#define PKGVERSION "@PACKAGE_VERSION@"' >packageversion.h
+
+pkgincludedir.h: config.status
+ echo '#define PKGINCLUDEDIR "$(includedir)"' >pkgincludedir.h
+
+mailusergroup.h: config.status
+ echo '#define MAILUSER "@mailuser@"' >mailusergroup.h
+ echo '#define MAILGROUP "@mailgroup@"' >>mailusergroup.h
+
+dist-hook:
+ for f in $(BUILT1) ; do rm -f $(distdir)/$$f; done
+
+# automake still a bit stupid...
+
+install-data-hook: install-authdaemonrc install-authpgsqlrc \
+ install-authldaprc install-authmysqlrc
+ :
+
+install-exec-hook:
+ $(mkinstalldirs) $(DESTDIR)$(bindir) || :
+ $(mkinstalldirs) $(DESTDIR)$(sbindir) || :
+ $(mkinstalldirs) $(DESTDIR)$(pkglibexecdir) || :
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) authdaemondprog $(DESTDIR)$(pkglibexecdir)/authdaemond
+ $(mkinstalldirs) $(DESTDIR)@authdaemonvar@ || :
+ chmod 750 $(DESTDIR)@authdaemonvar@
+ -chown @mailuser@ $(DESTDIR)@authdaemonvar@
+ -chgrp @mailgroup@ $(DESTDIR)@authdaemonvar@
+ test "@LIBAUTHUSERDB@" = "" && exit 0 ;\
+ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) makedat/makedatprog \
+ $(DESTDIR)$(pkglibexecdir)/makedatprog ; \
+ $(INSTALL_SCRIPT) userdb/vchkpw2userdb \
+ $(DESTDIR)$(sbindir)/vchkpw2userdb ; \
+ $(INSTALL_SCRIPT) userdb/pw2userdb \
+ $(DESTDIR)$(sbindir)/pw2userdb ; \
+ $(INSTALL_SCRIPT) userdb/makeuserdb \
+ $(DESTDIR)$(sbindir)/makeuserdb ; \
+ $(INSTALL_SCRIPT) userdb/userdb.pl \
+ $(DESTDIR)$(sbindir)/userdb ; \
+ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) userdb/userdbpw \
+ $(DESTDIR)$(sbindir)/userdbpw ; \
+ $(INSTALL_SCRIPT) userdb-test-cram-md5.pl \
+ $(DESTDIR)$(sbindir)/userdb-test-cram-md5
+
+uninstall-hook: uninstall-authldaprc uninstall-authdaemonrc uninstall-authmysqlrc uninstall-authpgsqlrc
+ rm -f $(DESTDIR)$(pkglibexecdir)/authdaemond
+ test "@AUTHUSERDB@" = "" && exit 0 ;\
+ rm -f $(DESTDIR)$(pkglibexecdir)/makedatprog \
+ $(DESTDIR)$(sbindir)/vchkpw2userdb \
+ $(DESTDIR)$(sbindir)/pw2userdb \
+ $(DESTDIR)$(sbindir)/makeuserdb \
+ $(DESTDIR)$(sbindir)/userdb \
+ $(DESTDIR)$(sbindir)/userdbpw \
+ $(DESTDIR)$(sbindir)/userdb-test-cram-md5
+
+authlib.html: authlib.html.in
+ CONFIG_FILES=authlib.html CONFIG_HEADERS= $(SHELL) ./config.status
+
+authlib.3: authlib.3.in
+ CONFIG_FILES=authlib.3 CONFIG_HEADERS= $(SHELL) ./config.status
+
+@HAVE_SGML_TRUE@authpasswd.html: authpasswd.sgml docbook/sgml2html
+@HAVE_SGML_TRUE@ docbook/sgml2html authpasswd.sgml authpasswd.html
+
+@HAVE_SGML_TRUE@authpasswd.1: authpasswd.sgml docbook/sgml2man
+@HAVE_SGML_TRUE@ docbook/sgml2man authpasswd.sgml authpasswd.1
+
+@HAVE_SGML_TRUE@authtest.html: authtest.sgml docbook/sgml2html
+@HAVE_SGML_TRUE@ docbook/sgml2html authtest.sgml authtest.html
+
+@HAVE_SGML_TRUE@authtest.1: authtest.sgml docbook/sgml2man
+@HAVE_SGML_TRUE@ docbook/sgml2man authtest.sgml authtest.1
+
+@HAVE_SGML_TRUE@authlib.html.in: authlib.sgml docbook/sgml2html
+@HAVE_SGML_TRUE@ docbook/sgml2html authlib.sgml authlib.html.in
+
+@HAVE_SGML_TRUE@authlib.3.in: authlib.sgml docbook/sgml2man
+@HAVE_SGML_TRUE@ docbook/sgml2man authlib.sgml authlib.3.in
+
+@HAVE_SGML_TRUE@README_authlib.html.in: README_authlib.sgml docbook/sgml2html
+@HAVE_SGML_TRUE@ docbook/sgml2html README_authlib.sgml README_authlib.html.in
+
+@HAVE_SGML_TRUE@auth_generic.html: auth_generic.sgml authcallback.sgml docbook/sgml2html
+@HAVE_SGML_TRUE@ docbook/sgml2html auth_generic.sgml auth_generic.html
+
+@HAVE_SGML_TRUE@auth_generic.3: auth_generic.sgml authcallback.sgml docbook/sgml2man
+@HAVE_SGML_TRUE@ docbook/sgml2man auth_generic.sgml auth_generic.3
+
+@HAVE_SGML_TRUE@auth_login.html: auth_login.sgml authcallback.sgml docbook/sgml2html
+@HAVE_SGML_TRUE@ docbook/sgml2html auth_login.sgml auth_login.html
+
+@HAVE_SGML_TRUE@auth_login.3: auth_login.sgml authcallback.sgml docbook/sgml2man
+@HAVE_SGML_TRUE@ docbook/sgml2man auth_login.sgml auth_login.3
+
+@HAVE_SGML_TRUE@auth_getuserinfo.html: auth_getuserinfo.sgml authcallback.sgml docbook/sgml2html
+@HAVE_SGML_TRUE@ docbook/sgml2html auth_getuserinfo.sgml auth_getuserinfo.html
+
+@HAVE_SGML_TRUE@auth_getuserinfo.3: auth_getuserinfo.sgml authcallback.sgml docbook/sgml2man
+@HAVE_SGML_TRUE@ docbook/sgml2man auth_getuserinfo.sgml auth_getuserinfo.3
+
+@HAVE_SGML_TRUE@auth_enumerate.html: auth_enumerate.sgml docbook/sgml2html
+@HAVE_SGML_TRUE@ docbook/sgml2html auth_enumerate.sgml auth_enumerate.html
+
+@HAVE_SGML_TRUE@auth_enumerate.3: auth_enumerate.sgml docbook/sgml2man
+@HAVE_SGML_TRUE@ docbook/sgml2man auth_enumerate.sgml auth_enumerate.3
+
+@HAVE_SGML_TRUE@auth_passwd.html: auth_passwd.sgml docbook/sgml2html
+@HAVE_SGML_TRUE@ docbook/sgml2html auth_passwd.sgml auth_passwd.html
+
+@HAVE_SGML_TRUE@auth_passwd.3: auth_passwd.sgml docbook/sgml2man
+@HAVE_SGML_TRUE@ docbook/sgml2man auth_passwd.sgml auth_passwd.3
+
+@HAVE_SGML_TRUE@auth_getoption.html: auth_getoption.sgml docbook/sgml2html
+@HAVE_SGML_TRUE@ docbook/sgml2html auth_getoption.sgml auth_getoption.html
+
+@HAVE_SGML_TRUE@auth_getoption.3: auth_getoption.sgml docbook/sgml2man
+@HAVE_SGML_TRUE@ docbook/sgml2man auth_getoption.sgml auth_getoption.3
+
+@HAVE_SGML_TRUE@auth_sasl.html: auth_sasl.sgml docbook/sgml2html
+@HAVE_SGML_TRUE@ docbook/sgml2html auth_sasl.sgml auth_sasl.html
+
+@HAVE_SGML_TRUE@auth_sasl.3: auth_sasl.sgml docbook/sgml2man
+@HAVE_SGML_TRUE@ docbook/sgml2man auth_sasl.sgml auth_sasl.3
+
+README_authlib.html: README_authlib.html.in config.status
+ CONFIG_FILES=README_authlib.html CONFIG_HEADERS= $(SHELL) ./config.status
+
+authdaemond.o: authdaemonrc.h authdaemond.c
+
+install-migrate: authmigrate
+ @SHELL@ authmigrate
+
+install-configure:
+ test -f $(DESTDIR)@authdaemonrc@.dist && @SYSCONFTOOL@ $(DESTDIR)@authdaemonrc@.dist || true
+ test -f $(DESTDIR)@authmysqlrc@.dist && @SYSCONFTOOL@ $(DESTDIR)@authmysqlrc@.dist || true
+ test -f $(DESTDIR)@authpgsqlrc@.dist && @SYSCONFTOOL@ $(DESTDIR)@authpgsqlrc@.dist || true
+ test -f $(DESTDIR)@authldaprc@.dist && @SYSCONFTOOL@ $(DESTDIR)@authldaprc@.dist || true
+
+# For maintainer's use only
+
+distrelease:
+ umask 022; $(MAKE) -$(MAKEFLAGS) distcheck
+ $(MAKE) -$(MAKEFLAGS) rpm
+ socksify cvs commit
+ socksify cvs tag -F @PACKAGE@-latest
+ $(MAKE) -$(MAKEFLAGS)
+ $(MAKE) -$(MAKEFLAGS)
+ rm -f @PACKAGE@.spec @PACKAGE@.lpspec
+ $(MAKE) -$(MAKEFLAGS) @PACKAGE@.spec @PACKAGE@.lpspec
+ $(MAKE) -$(MAKEFLAGS) dist
+
+tagrelease:
+ socksify cvs tag -F -r @PACKAGE@-latest \
+ `echo @PACKAGE@-@VERSION@ | tr '.' '-'`
+
+rpm: rpm-build
+
+rpm-build:
+ $(MAKE) -$(MAKEFLAGS) bump.rpm.release
+ $(MAKE) -$(MAKEFLAGS) dist
+ $(MAKE) -$(MAKEFLAGS) dorpm
+
+lpm: lpm-build
+
+lpm-build:
+ $(MAKE) -$(MAKEFLAGS) bump.rpm.release
+ $(MAKE) -$(MAKEFLAGS) dist
+ $(MAKE) -$(MAKEFLAGS) dolpm
+
+dolpm:
+ rm -rf lpm
+ mkdir lpm
+ lpbuild `test "@REPOSITORY@" == "" || echo --define "repository=1"` --srcbuild -o lpm @PACKAGE@-@VERSION@.tar.bz2
+
+publish: publish-@REPOSITORY@
+
+publish-dev:
+ $(MAKE) -$(MAKEFLAGS) dopublish SUBDIR=dev
+
+publish-prod:
+ $(MAKE) -$(MAKEFLAGS) dopublish SUBDIR=prod
+
+dopublish:
+ lpbuild --resign lpm/*
+ rm -rf lpmtmp
+ mkdir lpmtmp
+ ln lpm/* lpmtmp
+ rm -f lpmtmp/*debuginfo*
+ mv lpmtmp/*.src.lp repository-$(SUBDIR)/`lpm -q --distribution`/sources
+ mv lpmtmp/*.lp repository-$(SUBDIR)/`lpm -q --distribution`/packages
+ rm -rf lpmtmp
+ ls -t repository-$(SUBDIR)/`lpm -q --distribution`/sources | tail -n +6 | xargs -r -n 1 lpm --erase repository-$(SUBDIR)
+ lpm --sync repository-$(SUBDIR)
+ rsync -a -v --delete-after repository-$(SUBDIR)/`lpm -q --distribution`/. headache:lpmtool.com/www/repositories/$(SUBDIR)/courier-authlib/`lpm -q --distribution`
+
+dorpm:
+ rm -rf rpm/BUILD/*
+ rm -f rpm/RPMS/*/*
+ rm -f rpm/SOURCES/*
+ rm -f rpm/SPECS/*
+ rm -f rpm/SRPMS/*
+ unset MAKEFLAGS ; test ! -f $$HOME/.bashrc || . $$HOME/.bashrc; rpmbuild -ta --clean @PACKAGE@-@VERSION@.tar.bz2
+
+bump.rpm.release: @PACKAGE@.spec @PACKAGE@.lpspec
+ test -f $(srcdir)/rpm.release && . $(srcdir)/rpm.release; \
+ NEXT_RELEASE=0; \
+ test "$$VERSION" = "@VERSION@" && NEXT_RELEASE="$$RELEASE"; \
+ RELEASE=`expr $$NEXT_RELEASE + 1`; \
+ echo "VERSION=@VERSION@" >$(srcdir)/rpm.release; \
+ echo "RELEASE=$$RELEASE" >>$(srcdir)/rpm.release; \
+ sed 's/^Release: .*/Release: '$$RELEASE'%{courier_release}/' \
+ <@PACKAGE@.spec >@PACKAGE@.spec.new; \
+ mv @PACKAGE@.spec.new @PACKAGE@.spec; \
+ sed 's/^Release: .*/Release: '$$RELEASE'/' \
+ <@PACKAGE@.lpspec >@PACKAGE@.lpspec.new; \
+ mv @PACKAGE@.lpspec.new @PACKAGE@.lpspec
+
+upload-beta:
+ rm -f @PACKAGE@-@VERSION@.tar.bz2.sig; gpg --detach-sign --default-key mrsam@courier-mta.com @PACKAGE@-@VERSION@.tar.bz2; test -f @PACKAGE@-@VERSION@.tar.bz2.sig || exit 1
+ socksify ssh courier.sourceforge.net echo @PACKAGE@-@VERSION@.tar.bz2 `ls -l @PACKAGE@-@VERSION@.tar.bz2 | awk ' { print $$5 } '` \>/home/groups/c/co/courier/@PACKAGE@.beta
+ ssh headache 'cd torrents.courier-mta.org/pub/@PACKAGE@-dev && rm -rf @PACKAGE@-@VERSION@ && mkdir @PACKAGE@-@VERSION@ && echo seeder_args=--max_upload_rate 50 >@PACKAGE@-@VERSION@.info && ls -t | sed 1,6d | xargs rm -rf '
+ scp @PACKAGE@-@VERSION@.tar.bz2 @PACKAGE@-@VERSION@.tar.bz2.sig headache:torrents.courier-mta.org/pub/@PACKAGE@-dev/@PACKAGE@-@VERSION@
+
+upload-dist:
+ rm -f @PACKAGE@-@VERSION@.tar.bz2.sig; gpg --detach-sign --default-key mrsam@courier-mta.com @PACKAGE@-@VERSION@.tar.bz2; test -f @PACKAGE@-@VERSION@.tar.bz2.sig || exit 1
+ socksify cvs tag -F -r @PACKAGE@-latest \
+ `echo @PACKAGE@-@VERSION@ | tr '.' '-'`
+ socksify perl -e 'use Net::FTP; $$ftp=Net::FTP->new("upload.sourceforge.net.", Debug => 1, Passive => 1 ) || die; $$ftp->login("anonymous", "anonymous") || die; $$ftp->cwd("/incoming") && $$ftp->binary() && $$ftp->hash(1) && $$ftp->put("@PACKAGE@-@VERSION@.tar.bz2") && $$ftp->put("@PACKAGE@-@VERSION@.tar.bz2.sig") && exit 0; die;'
+ ssh headache 'cd torrents.courier-mta.org/pub/@PACKAGE@ && rm -rf @PACKAGE@-@VERSION@ && mkdir @PACKAGE@-@VERSION@ && echo seeder_args=--max_upload_rate 50 >@PACKAGE@-@VERSION@.info && ls -t | sed 1,6d | xargs rm -rf '
+ scp @PACKAGE@-@VERSION@.tar.bz2 @PACKAGE@-@VERSION@.tar.bz2.sig headache:torrents.courier-mta.org/pub/@PACKAGE@/@PACKAGE@-@VERSION@
+
+release-dist:
+ test -z "$(SFPASSWD)" && exit 1; exit 0
+ ./changelog.pl >changelog.txt
+ emacs releasenotes.txt
+ test -f releasenotes.txt || exit 1
+ socksify ../sftools/release.pl mrsam $(SFPASSWD) courier authlib @VERSION@ releasenotes.txt changelog.txt @PACKAGE@-@VERSION@.tar.bz2 @PACKAGE@-@VERSION@.tar.bz2.sig
+ socksify ssh courier.sourceforge.net rm -f /home/groups/c/co/courier/@PACKAGE@.beta
+
+htmldoc: $(HTMLDOCFILES)
+ for f in $^; do d=`basename $$f`; test "$$d" = "README.html" && d="index2.html"; xsltproc --nonet $(srcdir)/prep.xsl $$f | perl -ne 's~\$(id):.*\$$~\$(id):'"$$h"'\$$~; print' >html/$$d; done
+# 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:
--- /dev/null
+ Courier Authentication Library
+
+ This is the initial release of the Courier Authentication Library. See the
+ README file for background information on courier-authlib.
+
+ Upgrading from older versions of Courier packages that used to include
+ this authentication library as part of the package, instead of standalone,
+ should be as simple as:
+
+ ./configure
+ make
+ make install
+ make install-migrate
+ make install-configure
+
+Requirements
+
+ The Courier authentication library should not have any more requirements
+ than the older Courier packages it used to be a part of. There may be an
+ exception on some less-common platforms. They may require some additional
+ stuff to be loaded before courier-authlib can be installed. This is
+ because courier-authlib now uses libtool, which is a new requirement.
+ Courier-authlib now uses shared libraries in the place of separate
+ authdaemond binaries in the previous versions. Some less-common platforms
+ may require additional software to be installed because of that, see
+ INSTALL for more information.
+
+The pluses
+
+ This new, self-sustaining Courier authentication library offers the
+ following benefits:
+
+ * Upgrading from Courier-IMAP or SqWebMail to the full Courier package
+ does not require authentication re-configuration.
+ * Consolidated documentation. Instructions for setting up MySQL,
+ PostgreSQL, and the rest, are currently duplicated twice, making it a
+ maintenance pain. Now, the documentation will be in one place, and can
+ be easily improved, and overhauled. There will be an initial hump to
+ ride over, to reconcile the minor differences in the authentication
+ documentation in Courier, Courier-IMAP, and SqWebMail. Going forward,
+ though, everything will be in one place.
+ * The authentication API appears to be fairly stable and robust. It will
+ not be necessary to update the courier-authlib package with every
+ upgrade. Updates to courier-authlib are expected to be very
+ infrequent.
+ * There is a small minority of established systems that use the
+ standalone SqWebMail and Courier-IMAP packages. The consolidated
+ courier-authlib library will, as a bonus, provide an official way to
+ use only one set of config files, in this configuration.
+
+The minuses
+
+ I can only see one possible drawback. Only the daemonized configuration
+ will now be possible. This new version of the Courier authentication
+ library is, for all intents and purposes, the daemonized configuration of
+ the previous authentication library. The non-daemonized version of the
+ authentication library is no longer implemented. That code has been
+ removed for the simple reason that it can no longer be implemented, as a
+ standalone library. It's been clearly shown that the daemonized
+ configuration is the more flexible configuration, and is the only way to
+ go. The daemonized configuration was the default configuration for several
+ years.
+
+ I can only see the following minuses from losing the non-daemonized
+ configuration. I believe the minuses are greatly outranked by the pluses.
+
+ * There are some third party configuration libraries that only work in a
+ non-daemonized configuration. I'm aware of one such library, vmailmgr.
+ Unless it's been updated to work in daemonized mode, it will no longer
+ work.
+ * There are also some other third-party hacks that also only work in a
+ non-daemonized configuration. There's at least one relay-after-imap or
+ relay-after-pop hack for qmail, that only works in a daemonized
+ configuration. I believe that relay-after-X hacks have been obsolete
+ for several years now. Every mail client worth mentioning these days
+ implemented authenticated SMTP, and the relay-after-X hacks need to
+ go.
+
+ Currently, there are also some borderline configurations possible in a
+ non-daemonized configuration, such as using different authentication
+ modules completely for imap and pop3, or different authentication modules
+ for non-encrypted and encrypted connections. This will no longer be
+ possible, but I doubt that there's any valid reason to use such a strange
+ setup.
+
+Testing
+
+ The 'make install-migrate' command tries to import the authentication
+ configuration from any existing installed Courier package. The
+ configuration files for courier-authlib will end up in
+ /usr/local/lib/courier-authlib/etc/authlib. The existing Courier packages
+ don't really know how to use courier-authlib just yet. This will be the
+ next step.
+
+ However, after installing courier-authlib you should be able to do some
+ rudimentary testing by running 'authdaemond start' (where authdaemond is
+ what's in the /usr/local/lib/courier-authlib/sbin directory). The
+ following commands should now work (make sure the authdaemond and authtest
+ programs are the ones from /usr/local/lib/courier-authlib/sbin directory,
+ and not any existing Courier directory):
+
+ authtest userid
+ authtest userid password
+ authtest userid password newpassword
+ authenumerate
+
+ The first command displays the account's home directory, userid, groupid,
+ and other related data. The second command verifies whether the password
+ is valid, or not. The third command changes the password on the account
+ (be careful with that).
+
+ The goal is that everything should work automatically. In some cases, it
+ might be necessary to modify the new authdaemonrc configuration file
+ (unlike all othe configuration files, the install-migrate script won't
+ copy the existing authdaemonrc, a new one will be installed). Manually
+ edit it, and remove all authentication modules that are not needed,
+ leaving only the actual ones that are used.
+
+Debugging
+
+ To generate additional debugging messages, edit the authdaemond startup
+ script (installed in /usr/local/bin by default), and add the following to
+ the script:
+
+ DEBUG_LOGIN=2
+ export DEBUG_LOGIN
+
+ Debugging messages from the authentication daemon processes will be sent
+ to the syslog facility, and recorded in whatever log file syslog is
+ configured to use (usually /var/log/messages or /var/log/maillog).
--- /dev/null
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <title>NEWS</title>
+ <meta name="generator" content="amaya 8.7, see http://www.w3.org/Amaya/" />
+</head>
+
+<body>
+<h1>Courier Authentication Library</h1>
+
+<p>This is the initial release of the Courier Authentication Library. See the
+README file for background information on courier-authlib.</p>
+
+<p>Upgrading from older versions of Courier packages that used to include
+this authentication library as part of the package, instead of standalone,
+should be as simple as:</p>
+<pre>./configure
+make
+make install
+make install-migrate
+make install-configure</pre>
+
+<h2>Requirements</h2>
+
+<p>The Courier authentication library should not have any more requirements
+than the older Courier packages it used to be a part of. There may be an
+exception on some less-common platforms. They may require some additional
+stuff to be loaded before courier-authlib can be installed. This is because
+courier-authlib now uses <code>libtool</code>, which is a new requirement.
+Courier-authlib now uses shared libraries in the place of separate
+authdaemond binaries in the previous versions. Some less-common platforms may
+require additional software to be installed because of that, see INSTALL for
+more information.</p>
+
+<h2>The pluses</h2>
+
+<p>This new, self-sustaining Courier authentication library offers the
+following benefits:</p>
+<ul>
+ <li>Upgrading from Courier-IMAP or SqWebMail to the full Courier package
+ does not require authentication re-configuration.</li>
+ <li>Consolidated documentation. Instructions for setting up MySQL,
+ PostgreSQL, and the rest, are currently duplicated twice, making it a
+ maintenance pain. Now, the documentation will be in one place, and can be
+ easily improved, and overhauled. There will be an initial hump to ride
+ over, to reconcile the minor differences in the authentication
+ documentation in Courier, Courier-IMAP, and SqWebMail. Going forward,
+ though, everything will be in one place.</li>
+ <li>The authentication API appears to be fairly stable and robust. It will
+ not be necessary to update the courier-authlib package with every
+ upgrade. Updates to courier-authlib are expected to be very
+ infrequent.</li>
+ <li>There is a small minority of established systems that use the
+ standalone SqWebMail and Courier-IMAP packages. The consolidated
+ courier-authlib library will, as a bonus, provide an official way to use
+ only one set of config files, in this configuration.</li>
+</ul>
+
+<h2>The minuses</h2>
+
+<p>I can only see one possible drawback. Only the daemonized configuration
+will now be possible. This new version of the Courier authentication library
+is, for all intents and purposes, the daemonized configuration of the
+previous authentication library. The non-daemonized version of the
+authentication library is no longer implemented. That code has been removed
+for the simple reason that it can no longer be implemented, as a standalone
+library. It's been clearly shown that the daemonized configuration is the
+more flexible configuration, and is the only way to go. The daemonized
+configuration was the default configuration for several years.</p>
+
+<p>I can only see the following minuses from losing the non-daemonized
+configuration. I believe the minuses are greatly outranked by the pluses.</p>
+<ul>
+ <li>There are some third party configuration libraries that only work in a
+ non-daemonized configuration. I'm aware of one such library, vmailmgr.
+ Unless it's been updated to work in daemonized mode, it will no longer
+ work.</li>
+ <li>There are also some other third-party hacks that also only work in a
+ non-daemonized configuration. There's at least one relay-after-imap or
+ relay-after-pop hack for qmail, that only works in a daemonized
+ configuration. I believe that relay-after-X hacks have been obsolete for
+ several years now. Every mail client worth mentioning these days
+ implemented authenticated SMTP, and the relay-after-X hacks need to
+ go.</li>
+</ul>
+
+<p>Currently, there are also some borderline configurations possible in a
+non-daemonized configuration, such as using different authentication modules
+completely for imap and pop3, or different authentication modules for
+non-encrypted and encrypted connections. This will no longer be possible, but
+I doubt that there's any valid reason to use such a strange setup.</p>
+
+<h2>Testing</h2>
+
+<p>The '<code>make install-migrate</code>' command tries to import the
+authentication configuration from any existing installed Courier package. The
+configuration files for courier-authlib will end up in
+<code>/usr/local/lib/courier-authlib/etc/authlib</code>. The existing Courier
+packages don't really know how to use courier-authlib just yet. This will be
+the next step.</p>
+
+<p>However, after installing courier-authlib you should be able to do some
+rudimentary testing by running '<code>authdaemond start</code>' (where
+authdaemond is what's in the <code>/usr/local/lib/courier-authlib/sbin</code>
+directory). The following commands should now work (make sure the
+<code>authdaemond</code> and <code>authtest</code> programs are the ones from
+<code>/usr/local/lib/courier-authlib/sbin</code> directory, and not any
+existing Courier directory):</p>
+<pre>authtest userid
+authtest userid password
+authtest userid password newpassword
+authenumerate</pre>
+
+<p>The first command displays the account's home directory, userid, groupid,
+and other related data. The second command verifies whether the password is
+valid, or not. The third command changes the password on the account (be
+careful with that).</p>
+
+<p>The goal is that everything should work automatically. In some cases, it
+might be necessary to modify the new authdaemonrc configuration file (unlike
+all othe configuration files, the <code>install-migrate</code> script won't
+copy the existing <code>authdaemonrc</code>, a new one will be installed).
+Manually edit it, and remove all authentication modules that are not needed,
+leaving only the actual ones that are used.</p>
+
+<h2>Debugging</h2>
+
+<p>To generate additional debugging messages, edit the authdaemond startup
+script (installed in /usr/local/bin by default), and add the following to the
+script:</p>
+<pre>DEBUG_LOGIN=2
+export DEBUG_LOGIN</pre>
+
+<p>Debugging messages from the authentication daemon processes will be sent
+to the syslog facility, and recorded in whatever log file syslog is
+configured to use (usually <code>/var/log/messages</code> or
+<code>/var/log/maillog</code>).</p>
+</body>
+</html>
--- /dev/null
+ Courier Authentication Library
+
+ This is the Courier authentication library. Copies of this library code
+ used to exist in other tarballs: Courier, Courier-IMAP, and SqWebMail.
+ Building and installing any of these packages would've automatically
+ installed this authentication code.
+
+ The authentication library is now a separate, standalone package. This
+ authentication library must now be installed, separately, before upgrading
+ to the following builds (or if installing them for the first time):
+ Courier 0.48, Courier-IMAP 4.0, and SqWebMail 5.0. See [1]NEWS for more
+ information.
+
+ Download: [2]http://www.courier-mta.org/download.php#authlib
+
+Overview
+
+ The Courier authentication library provides authentication services for
+ other Courier applications. In this context, the term "authentication"
+ refers to the following functions:
+
+ 1. Take a userid or a loginid, and a password. Determine whether the
+ loginid and the password are valid.
+ 2. Given a userid, obtain the following information about the userid:
+
+ A. The account's home directory.
+ B. The numeric system userid and groupid that owns all files
+ associated with this account.
+ C. The location of the account's maildir.
+ D. Any maildir quota defined for this account. See the Courier
+ documentation for more information on maildir quotas.
+ E. Other miscellaneous account-specific options.
+
+ 3. Change the password associated with a loginid.
+ 4. Obtain a complete list of all loginids.
+
+ The Courier authentication library provides alternative implementations of
+ these authentication services:
+
+ 1. Use the traditional system password files: /etc/passwd and
+ /etc/shadow, possibly in conjunction with the PAM library.
+ 2. Maintain all this information in a GDBM or a DB database. The GDBM or
+ the DB database is compiled from plain text files. Perl scripts
+ provide a simple interface for creating and editing the authentication
+ information, then a script compiles the plain text files into a
+ database.
+ 3. Use an LDAP server for authentication.
+ 4. Use a table in a MySQL database for authentication.
+ 5. Use a table in a PostgreSQL database for authentication.
+
+ All Courier components that use this authentication library, therefore,
+ will be able to authenticate E-mail accounts using any of the above
+ methods.
+
+ Additional information can be found in the [3]INSTALL file.
+
+ The authentication API is [4]documented.
+
+Further resources
+
+ Subscribe to the courier-users mailing list:
+ [5]http://lists.sourceforge.net/lists/listinfo/courier-users.
+
+References
+
+ Visible links
+ 1. file:///home/mrsam/src/courier-authlib/NEWS.html
+ 2. http://www.courier-mta.org/download.php#authlib
+ 3. file:///home/mrsam/src/courier-authlib/INSTALL.html
+ 4. file:///home/mrsam/src/courier-authlib/authlib.html
+ 5. http://lists.sourceforge.net/lists/listinfo/courier-users
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="">
+ <title>Debugging authentication problems</title>
+</head>
+
+<body bgcolor="#FFFFFF">
+<h1 align="center">Debugging authentication problems</h1>
+
+<p>A common problem after installing the Courier authentication library is
+that authentication, using authtest, doesn't work. This document shows how to
+use courier's debugging features to pinpoint the problem.</p>
+
+<h2>1. Turn on debugging</h2>
+
+<p>For courier-imap, you need to set one of the following values in
+@sysconfdir@/authdaemonrc:</p>
+<pre>DEBUG_LOGIN=1 # turn on authentication debugging
+DEBUG_LOGIN=2 # turn on authentication debugging AND show passwords</pre>
+
+<p>This setting is located at the very end of the configuration file.</p>
+
+<p>After changing this setting, restart the authentication daemon by running
+the "authdaemond stop" and "authdaemond start" commands.</p>
+
+<p>At this point, all debugging output goes to syslog at level 'debug', which
+is normally not shown. You will probably need to change your
+<code>/etc/syslog.conf</code> file to be able to see these messages. If you
+have an existing entry which says "mail.info" (which means facility 'mail',
+level 'info' or higher) then you can just change this to "mail.debug".
+Alternatively you can add a new entry like this:</p>
+<pre>*.debug /var/log/debug</pre>
+
+<p>Don't forget to create this file, and to send a HUP signal to syslogd to
+make it re-read its configuration:</p>
+<pre># touch /var/log/debug
+# killall -1 syslogd</pre>
+
+<p>If you don't want to mess around with your syslog configuration, you can
+also start <code>authdaemond</code> manually, and log its output to a
+file:</p>
+
+<p><code>@libexecdir@/courier-authlib/authdaemond >filename
+2>&1</code></p>
+
+<h2>2. Issue a manual login</h2>
+
+<p>You can use the authtest command to verify authentication, or go ahead and
+install Courier-IMAP.</p>
+
+<p>For courier-imap, you will get much better information by not using a mail
+client and manually logging in using 'telnet'. The transcript of this telnet
+session may give useful information as to what is going on. If you are going
+to report a problem to the mailing list, you should certainly include this
+transcript as well as the corresponding debugging output.</p>
+<pre>-- to debug POP3 --
+# telnet x.x.x.x 110
+user USERNAME
+pass PASSWORD
+stat
+quit
+
+-- to debug IMAP --
+# telnet x.x.x.x 143
+a login USERNAME PASSWORD
+a examine inbox
+a logout
+
+-- to debug POP3 over SSL --
+# openssl s_client -connect x.x.x.x:995
+(then use same commands as POP3 example)
+
+-- to debug IMAP over SSL --
+# openssl s_client -connect x.x.x.x:993
+(then use same commands as IMAP example)</pre>
+
+<p>This isn't an option for sqwebmail of course - just login through the web
+interface and check the authentication debug log which is generated.</p>
+
+<h2>3. Interpret the debug output</h2>
+
+<p>First, a brief explanation of courier's authentication system. There are a
+number of standalone <b>authentication modules</b>. An authentication module
+exists for every authentication method. Each authentication module is
+installed as a shared library. When <strong>authdaemond</strong> starts, it
+attempts to load and initialize the authentication modules, logging the
+following messages to syslog:</p>
+<pre>Oct 17 11:25:37 commodore authdaemond: modules="authuserdb authpam authpgsql authldap authmysql authcustom", daemons=5
+Oct 17 11:25:37 commodore authdaemond: Installing libauthuserdb
+Oct 17 11:25:37 commodore authdaemond: Installation complete: authuserdb
+Oct 17 11:25:37 commodore authdaemond: Installing libauthpam
+Oct 17 11:25:37 commodore authdaemond: Installation complete: authpam
+Oct 17 11:25:37 commodore authdaemond: Installing libauthpgsql
+Oct 17 11:25:37 commodore authdaemond: libauthpgsql.so: cannot open shared object file: No such file or directory
+Oct 17 11:25:37 commodore authdaemond: Installing libauthldap
+Oct 17 11:25:37 commodore authdaemond: libauthldap.so: cannot open shared object file: No such file or directory
+Oct 17 11:25:37 commodore authdaemond: Installing libauthmysql
+Oct 17 11:25:37 commodore authdaemond: libauthmysql.so: cannot open shared object file: No such file or directory
+Oct 17 11:25:37 commodore authdaemond: Installing libauthcustom
+Oct 17 11:25:37 commodore authdaemond: Installation complete: authcustom</pre>
+
+<p>The first message lists all authentication modules that were compiled, and
+indicates that <strong>authdaemond</strong> will spawn five processes to
+handle all authentication requests. This is followed by messages indicating
+that indicate which authentication modules were installed.</p>
+
+<p>In this example, authdaemond did not load the authpgsql, authldap, and
+authmysql modules. That's because in this case the Courier authentication
+library is installed by the system's package manager. The LDAP, MySQL, and
+PostgreSQL support was placed into optional sub-packages which are not
+installed. Even though all of these modules were initially compiled, the
+optional authentication modules were not installed.</p>
+
+<p>This is normal. authdaemond will simply ignore any authentication module
+it cannot find, and will activate only those modules that are available. When
+an authentication request comes in, all of the modules will be executed, one
+after the other, resulting in one of three conditions:</p>
+<dl>
+ <dt>ACCEPT</dt>
+ <dd>The user was authenticated successfully</dd>
+ <dt>REJECT</dt>
+ <dd>The module did not know this username, or the user gave invalid
+ credentials. The request is passed to the next module.</dd>
+ <dt>TEMPFAIL</dt>
+ <dd>The module suffered an internal failure, such as inability to contact
+ an external database. The login is rejected, and no further modules are
+ tried.</dd>
+</dl>
+
+<p>In a typical Courier installation the authentication request is sent, via
+a filesystem socket, to a pool of <b>authdaemond</b> processes (note the
+extra "d" on the end) which perform the actual work. authdaemond, in turn,
+contains other authentication modules such as authpam, authmysql, and so
+on.</p>
+
+<p>If <code>authdaemond</code> is running successfully, then it will in turn
+run each of the modules it is linked against. If any one returns REJECT then
+the next is tried; if any returns TEMPFAIL or ACCEPT then no further modules
+are tried.</p>
+
+<p>So a typical example might look like this:</p>
+<pre>Apr 14 14:07:15 billdog authdaemond: received auth request, service=pop3, authtype=login
+Apr 14 14:07:15 billdog authdaemond: authcustom: trying this module
+Apr 14 14:07:15 billdog authdaemond: authcustom: nothing implemented in do_auth_custom()
+Apr 14 14:07:15 billdog authdaemond: authcustom: REJECT - try next module
+Apr 14 14:07:15 billdog authdaemond: authcram: trying this module
+Apr 14 14:07:15 billdog authdaemond: cram: only supports authtype=cram-*
+Apr 14 14:07:15 billdog authdaemond: authcram: REJECT - try next module
+Apr 14 14:07:15 billdog authdaemond: authuserdb: trying this module
+Apr 14 14:07:15 billdog authdaemond: userdb: opened /etc/userdb.dat
+Apr 14 14:07:15 billdog authdaemond: userdb: looking up 'brian'
+Apr 14 14:07:15 billdog authdaemond: userdb: entry not found
+Apr 14 14:07:15 billdog authdaemond: authuserdb: REJECT - try next module
+Apr 14 14:07:15 billdog authdaemond: authpam: trying this module
+Apr 14 14:07:15 billdog authdaemond: authpam: sysusername=brian, sysuserid=<null>, sysgroupid=1001, homedir=/home/brian, address=brian, fullname=Brian Candler, maildir=<null>, quota=<null>, options=<null>
+Apr 14 14:07:15 billdog authdaemond: pam_service=pop3, pam_username=brian
+Apr 14 14:07:15 billdog authdaemond: dopam successful
+Apr 14 14:07:15 billdog authdaemond: authpam: ACCEPT, username brian</pre>
+
+<p>What's happening here?</p>
+<ul>
+ <li>The request was received by 'authdaemond'</li>
+ <li>It tries 'authcustom' - this module does nothing unless you have
+ customised it yourself, so it REJECTs the request</li>
+ <li>It tried 'authcram', but since this was a request with authtype=login
+ (rather than authtype=cram-md5, say), this module cannot handle it so it
+ REJECTs</li>
+ <li>'authuserdb' has a go. In this case there is an /etc/userdb.dat file
+ for it to look in, but the requested username 'brian' does not exist in
+ there, so it REJECTs</li>
+ <li>'authpam' has a go. It finds the username and home directory in
+ /etc/passwd, and then calls the PAM subsystem to authenticate. The
+ authentication is successful.</li>
+</ul>
+
+<p>So, in principle, debugging is straightforward. Watch the modules operate,
+search for the one which you <i>think</i> should be authenticating the user,
+and if it is not, check for REJECT (user not known or password mismatch) or
+TEMPFAIL (internal error) status. Additional messages should indicate why
+this status was returned.</p>
+
+<h2>4. Read the documentation</h2>
+
+<p>Most of the configuration files like authldaprc, authmysql are well
+documented with comments.</p>
+
+<p>For the nitty-gritty details of authentication modules, see <a
+href="http://www.courier-mta.org/authlib.html">man authlib</a>. There is
+probably a copy of this manpage installed on your system; if that command
+doesn't work, try one of these:</p>
+<pre># man -M @prefix@/man authlib
+or
+# cd /path/to/sources
+# cd authlib
+# nroff -mandoc authlib.7.in | less</pre>
+
+<p>If you are using userdb authentication, you definitely need to read <a
+href="http://www.courier-mta.org/makeuserdb.html">man makeuserdb</a>, <a
+href="http://www.courier-mta.org/userdb.html">man userdb</a>, and <a
+href="http://www.courier-mta.org/userdbpw.html">man userdbpw</a>.</p>
+
+<h2>5. Use the mailing list</h2>
+
+<p>Please read through the common problems and solutions at the bottom of
+this document. The next thing to do, of course, is search the web to see if
+your particular problem has been seen before and solved. <a
+href="http://www.google.com">Google</a> is very good for this.</p>
+
+<p>If you still cannot work out what the problem is, then you can ask on the
+<a
+href="http://lists.sourceforge.net/mailman/listinfo/courier-imap">courier-imap</a>
+or <a href="mailto:sqwebmail-subscribe@inter7.com">sqwebmail</a> mailing
+lists. But before you post, please gather together all the following
+information:</p>
+<ul>
+ <li>The operating system and version you are running</li>
+ <li>The version of courier-imap/sqwebmail you have installed</li>
+ <li>The <code>./configure</code> command line you gave to build it</li>
+ <li>If you didn't build it yourself, where you got the package from (and if
+ possible, find out from the packager what options they used to build
+ it)</li>
+ <li>The versions of any other relevant software which you are linking
+ against, e.g. vpopmail, openldap, mysql, pgsql</li>
+ <li>The transcript of the 'telnet' session you used to test
+ [courier-imap]</li>
+ <li>The corresponding debug output which was generated for that session</li>
+ <li>The contents of the 'pop3d' and 'imapd' configuration files
+ [courier-imap]</li>
+ <li>The contents of the any other relevant configuration files, e.g.
+ authldaprc, authmysqlrc</li>
+ <li>A copy of the database entry you are trying to authenticate against:
+ e.g. the line from your userdb file, an LDAP entry, a row from your mysql
+ table, the line in /etc/password, etc.</li>
+</ul>
+
+<p>If you include all this, you are <i>much</i> more likely to get a helpful
+response.</p>
+<hr>
+
+<h2>Frequently seen authentication problems and solutions</h2>
+
+<p>See also the <a href="http://www.courier-mta.org/FAQ.html">Courier MTA
+FAQ</a></p>
+
+<h3>I get intermittent authentication problems with vpopmail</h3>
+
+<p>This is a known problem with vpopmail 5.2.1 and earlier. You need to
+upgrade to 5.2.2 or later, and then recompile courier-authlib.</p>
+
+<h3>Compiling fails with "cannot find -lvpopmail"</h3>
+
+<p>This is usually a permissions problem on the vpopmail library. Try:</p>
+<pre># chmod +rx /home/vpopmail /home/vpopmail/lib</pre>
+Alternatively, it might be a problem finding the vpopmail headers or library,
+in which case try:
+<pre># CPPFLAGS="-I/home/vpopmail/include"; export CPPFLAGS
+# LDFLAGS="-L/home/vpopmail/lib"; export LDFLAGS
+# ./configure ...</pre>
+
+<h3>When I try to login with POP3 using telnet, the server disconnects
+immediately after the "PASS" command, without giving a -ERR response</h3>
+
+<p>The reason for this error will probably be found in your mail logs.
+Usually it indicates either that the home directory does not exist (chdir
+failed), or the Maildir has not been created. See 'man maildirmake'.</p>
+
+<h3>PAM authentication says "pam_start failed, result 4 [Hint: bad PAM
+configuration?]"</h3>
+
+<p>Probably your PAM configuration is bad. If you have /etc/pam.d/other, then
+try simply removing /etc/pam.d/pop3 and /etc/pam.d/imap and see if it works
+(this is sufficient for FreeBSD). Otherwise, try copying one of your existing
+/etc/pam.d/xxx files to /etc/pam.d/pop3, imap or webmail respectively. <br>
+The result value is a PAM_XXXX constant from
+<code>/usr/include/security/pam_constants.h</code> (this file may be in a
+different location on your system). Under FreeBSD, 4 is PAM_SYSTEM_ERR.</p>
+
+<h3>When I connect on the SSL ports (995 or 993), the server accepts the
+connection but then immediately disconnects</h3>
+
+<p>You probably didn't install any SSL certificates. Courier-imap comes with
+scripts you can run to do this for you:</p>
+<pre># @prefix@/sbin/mkimapdcert
+# @prefix@/sbin/mkpop3dcert</pre>
+
+<h3>I expected the authentication library to compile authmysql (or some other
+module), but it's not there</h3>
+
+<p>If the mysql authentication module did not compile, then perhaps
+./configure was unable to find your mysql libraries (you can read through the
+file 'config.log' in the source directory to see what it found). You may need
+to force it to look in the right place, as follows:</p>
+<pre># ./configure --with-authmsql --with-mysql-libs=/usr/local/mysql/lib \
+ --with-mysql-includes=/usr/local/mysql/include</pre>
+
+<p>On some systems (e.g. FreeBSD), the mysqlclient library depends on the
+math and compression libraries. For these systems, try:</p>
+<pre># LDFLAGS="-lm -lz" ./configure --with-authmysql ... same as before</pre>
+
+<h3>The POP3/IMAP server says "Temporary problem, please try again later"
+when a bad password is entered</h3>
+
+<p><code>authdaemond</code> tries each of the configured authentication
+modules in turn, until either one accepts the login, or they have all
+rejected it (in which case the usual "Login failed" error is returned, and
+the user can try again).</p>
+
+<p>However, if one of these modules is unable to run because some resource is
+not available, then it gives a "temporary failure" response and no further
+modules are tried. You should find the exact cause in your mail logs, but
+typically it means that you have a module like 'authmysql' in your module
+list, but the mysql database is not running.</p>
+
+<p>So unless you actually do have account data in mysql (in which case you
+need to fix your mysql setup), you should remove 'authmysql' and any other
+modules you do not use from <code>authmodulelist</code> in
+<code>authdaemonrc</code>.</p>
+</body>
+</html>
--- /dev/null
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <title>Courier MySQL authentication module</title>
+ <meta name="MSSmartTagsPreventParsing" content="TRUE" />
+</head>
+
+<body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B"
+alink="#FF0000">
+<h1>Courier MySQL authentication module</h1>
+
+<p>This module allows authentication information to be stored in a MySQL
+database.</p>
+<ul>
+ <li>Supports both physical and virtual mail accounts.<br />
+ <br />
+ </li>
+ <li>Can be configured to use either crypted or cleartext passwords (or
+ both). Cleartext passwords allow CRAM-MD5 authentication to be
+ implemented.</li>
+</ul>
+
+<p>When <code>authmysql</code> is installed, a default configuration file,
+<code>authmysqlrc</code> will be installed too. You must edit this file to
+set up your MySQL authentication.</p>
+
+<p><strong>NOTE: this authentication module should NOT be used if you are
+using the vpopmail virtual mailing list manager. You should select the
+<code>authvchkpw</code> authentication module instead (which should happen
+automatically). It may be necessary to use the
+<code>--without-authmysql</code> flag to the <code>configure</code> script,
+because <code>configure</code> by default will include <code>authmysql</code>
+if it finds MySQL client libraries.</strong>.</p>
+<hr />
+
+<p>Edit <code>authmysqlrc</code>, and initialize the following variables:</p>
+<ul>
+ <li><code>MYSQL_SERVER</code> - MySQL server name (required).</li>
+ <li><code>MYSQL_PORT</code> - server port where MySQL accepts
+ connections.</li>
+ <li><code>MYSQL_SOCKET</code> - If MySQL is running on the same machine and
+ can accept connections from a filesystem socket, enter the path to the
+ filesystem socket here, and do not initialize SERVER/PORT.</li>
+ <li><code>MYSQL_USERNAME</code> - MySQL username with log in with
+ (required).</li>
+ <li><code>MYSQL_PASSWORD</code> - MySQL password with log in with
+ (required).</li>
+ <li><code>MYSQL_DATABASE</code> - MySQL database to log in to
+ (required).</li>
+ <li><code>MYSQL_SSL_KEY</code> - name of the field containing a SSL key path
+ (optional).</li>
+ <li><code>MYSQL_SSL_CERT</code> - name of the field containing a SSL
+ certificate path (optional).</li>
+ <li><code>MYSQL_SSL_CACERT</code> - name of the field containing a SSL CA
+ certificate (optional).</li>
+ <li><code>MYSQL_SSL_CAPATH</code> - name of the filend containing a name to a
+ directory that contains trusted SSL CA certificates in pem format. (optional).</li>
+ <li><code>MYSQL_SSL_CIPHER</code> - name of the field containing a SSL
+ cipher list (optional).</li>
+ <li><code>MYSQL_USER_TABLE</code> - name of the MySQL with the
+ authentication information (see below) (required).</li>
+ <li><code>MYSQL_LOGIN_FIELD</code> - field that contains the login id for
+ this account.</li>
+ <li><code>MYSQL_CRYPT_PWFIELD</code> - name of the field containing the
+ crypt-ed password (either <code>MYSQL_CRYPT_PWFIELD</code> or
+ <code>MYSQL_CLEAR_PWFIELD</code> is required). <strong>NOTE: this
+ password must be crypt-ed using the operating system's crypt function,
+ NOT MySQL's crypt function. MySQL's crypt() function is non-standard and
+ is not generally compatible with the operating system's crypt
+ function.</strong></li>
+ <li><code>MYSQL_CLEAR_PWFIELD</code> - name of the field containing the
+ cleartext password (either <code>MYSQL_CRYPT_PWFIELD</code> or
+ <code>MYSQL_CLEAR_PWFIELD</code> is required).</li>
+ <li><code>MYSQL_UID_FIELD</code> - field that contains the system userid
+ for this account.</li>
+ <li><code>MYSQL_GID_FIELD</code> - field that contains the system groupid
+ for this account.</li>
+ <li><code>MYSQL_MAILDIR_FIELD</code> - name of the field containing a
+ non-default location of the account's system mailbox (optional).</li>
+ <li><code>MYSQL_DEFAULTDELIVERY</code> - default mail delivery instructions
+ for the Courier mail server. If this field in the record is not empty,
+ its contents supercede the DEFAULTDELIVERY setting.</li>
+ <li><code>MYSQL_QUOTA_FIELD</code> - name of the field containing a maildir
+ quota (optional).</li>
+ <li><code>MYSQL_AUXOPTIONS</code> - auxiliary options. This field, if
+ defined, should consist of a <code>VARCHAR</code> consisting of a
+ comma-separate list of "<code>IDENTIFIER=VALUE</code>" pairs, that
+ specify per-account options. See INSTALL's description of the "Account
+ OPTIONS" setting for more information.</li>
+ <li><code>DEFAULT_DOMAIN</code> - if the user logs in without specifying
+ <code>@domain</code>, use the following domain (in this case the id field
+ must always contain <code>user@host</code>) (optional).</li>
+ <li><code>MYSQL_WHERE_CLAUSE</code> - optional freeform SQL that is
+ appended to the SQL query string.</li>
+</ul>
+
+<p>Here's a recommended definition of <code>MYSQL_USER_TABLE</code>:</p>
+<pre>CREATE TABLE passwd (
+ id char(128) DEFAULT '' NOT NULL,
+ crypt char(128) DEFAULT '' NOT NULL,
+ clear char(128) DEFAULT '' NOT NULL,
+ name char(128) DEFAULT '' NOT NULL,
+ uid int(10) unsigned DEFAULT '65534' NOT NULL,
+ gid int(10) unsigned DEFAULT '65534' NOT NULL,
+ home char(255) DEFAULT '' NOT NULL,
+ maildir char(255) DEFAULT '' NOT NULL,
+ defaultdelivery char(255) DEFAULT '' NOT NULL,
+ quota char(255) DEFAULT '' NOT NULL,
+ options char(255) DEFAULT '' NOT NULL,
+ KEY id (id(128))
+);</pre>
+
+<p>Observe that a valid SQL expression may be used in place of any field
+setting, since all that happens is that the contents of the settings are
+inserted into an SQL SELECT statement. Specifically, the <code>options</code>
+field may be replaced by several normal fields, such as
+"<code>disablepop3</code>", "<code>disableimap</code>",
+"<code>disablewebmail</code>", and "<code>sharedgroup</code>"; then
+<code>MYSQL_AUXOPTIONS</code> would be set to:</p>
+
+<blockquote>
+ <code>CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3,",disablewebmail=",disablewebmail,",sharedgroup=",sharedgroup)</code></blockquote>
+
+<p>This results in the expected comma-delimited options list, which is built
+up from individual table fields.</p>
+</body>
+</html>
--- /dev/null
+
+
+
+
+ Developer Notes for courier-imap-myownquery.patch
+
+
+
+
+ document version: 1.03
+ author: Pawel Wilk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0 What's that?
+
+1 Modifications overview
+
+2 Definitions
+
+3 New data types
+ 3.1 struct var_data
+ 3.2 typedef size_t (*parsefunc)
+
+4 New functions
+ 4.1 get_variable
+ 4.2 parse_core
+ 4.3 ParsePlugin_counter
+ 4.4 ParsePlugin_builder
+ 4.5 parse_string
+ 4.6 validate_password
+ 4.7 get_localpart
+ 4.8 get_domain
+ 4.9 parse_select_clause
+ 4.10 parse_chpass_clause
+
+5 Ideas and TODO
+
+6 Thanks
+
+
+
+
+ *-----------------------
+ 0 What's that?
+ *-----------------------
+
+Courier-imap-myownquery.patch allows administrator to set own SQL queries
+used by authdaemon to authenticate user (including fetchig credentials) and to
+change user's password. It allows to construct SELECT or UPDATE clause in the
+configuration file (authmysqlrc or authpgsqlrc) by adding two new configuration
+variables: MYSQL_SELECT_CLAUSE or PGSQL_SELECT_CLAUSE and MYSQL_CHPASS_CLAUSE
+or PGSQL_CHPASS_CLAUSE. It may be useful in the mail environments where there
+is such a need to have different database structure and/or tables scheme than
+expected by authmysql or authpgsql module.
+
+It also implements a small parsing engine for substitution variables which
+may appear in the clauses and are used to put informations like username
+or domain into the right place of a query.
+
+This patch was created using `diff -Nur` on courier-imap-1.3.12 source.
+
+
+
+
+
+ *-----------------------
+ 1 Modifications overview
+ *-----------------------
+
+Modified files: authmysqllib.c authmysqlrc authpgsqllib.c authpgsqlrc
+
+Each modified set of instructions is marked by my e-mail address:
+siefca@pld.org.pl (for MySQL files) or tom@minnesota.com (for PostgreSQL files)
+
+Changes in the current source code are related to:
+
+- sections where the queries are constructed
+ (including memory allocation for the buffers)
+
+ when MYSQL_SELECT_CLAUSE or MYSQL_CHPASS_CLAUSE or
+ PGSQL_SELECT_CLAUSE or PGSQL_CHPASS_CLAUSE is
+ used then the query goes through the parsing functions
+ passing over current memory allocation and query construction
+ subroutines
+
+- section where the configuration file is read
+
+ i've had to modify read_env() function to allow line breaks
+ - now each sequence of the backslash as a first character and
+ newline as the second is replaced by two whitespaces while
+ putting into the buffer
+
+- sections where the query is constructed
+
+ selection is made, depending on configuration variables which
+ are set or not - if own query is used
+
+
+
+
+
+ *-----------------------
+ 2 Definitions
+ *-----------------------
+
+#define MAX_SUBSTITUTION_LEN 32
+#define SV_BEGIN_MARK "$("
+#define SV_END_MARK ")"
+#define SV_BEGIN_LEN ((sizeof(SV_BEGIN_MARK))-1)
+#define SV_END_LEN ((sizeof(SV_END_MARK))-1)
+
+These definitions allows to change substitution marks in an easy way.
+SV_BEGIN_MARK refers to sequence of characters treated as a prefix of
+each substitution variable and SV_END_MARK refers to string which is
+a closing suffix. If the expected substitution variable is called
+'local_part' (without apostrophes) then '$(local_part)' is a valid
+string representation for SV_BEGIN_MARK set to "$(" and SV_END_MARK to ")".
+MAX_SUBSTITUTION_LEN defines maximal length of a substitution variable's
+identifier (name).
+
+The last two definitions are just for code simplification.
+
+
+
+
+
+
+ *-----------------------
+ 3 New data types
+ *-----------------------
+
+This section describes new data type definitions and variables.
+
+3.1 struct var_data
+
+struct var_data {
+ const char *name;
+ const char *value;
+ const size_t size;
+ size_t value_length;
+ } ;
+
+This structure holds information needed by parsing routines.
+Using var_data array you may specify a set of string substitutions
+which should be done while parsing a query. Last element in array
+should have all fields set to zero (null).
+
+name field - should contain substituted variable name
+value - should contain string which replaces it
+size - should contain string size including the last zero byte ('\0')
+value_length - should be set to zero - it is used as a value size cache
+
+
+explanation: size is used to increase speed of calculation proccess
+ value_length is used to cache length of a value during the
+ parsing subroutines - it helps when substitution variable
+ occures more than once within the query
+
+Example:
+
+struct var_data vdt[] = {
+ {"some", "replacement", sizeof("some"), 0},
+ {"anotha", NULL, sizeof("anotha"), 0},
+ {NULL, NULL, 0, 0}
+};
+
+In this example we've declared that $(some) in the query should be
+replaced by 'replacement' text, and replacement for $(anotha) will
+be defined in the code before passing on the array pointer to
+the paring function.
+
+
+3.2 typedef size_t (*parsefunc)
+
+typedef int (*parsefunc)(const char *, size_t, void *);
+
+This type definition refers to the function pointer, which is used
+to pass plugin functions into the core parsing subroutine. This definition
+is included to simplify the declaration of the parse_core() function.
+
+
+
+
+
+ *-----------------------
+ 4 New functions
+ *-----------------------
+
+This section describes added functions.
+
+4.1 get_variable
+
+NAME
+
+ get_variable
+
+SYNOPSIS
+
+ static const struct var_data *get_variable (const char *begin,
+ size_t len,
+ struct var_data *vdt);
+
+DESCRIPTION
+
+ This function searches an array pointed by vdt and tries to find
+ the substitution variable, which name is identified with begin
+ pointer and length of len bytes long.
+
+ This function is also responsible for updating length cache field
+ of vdt elements and validating requested variables.
+
+ This function repports errors by sending human readable
+ messages to the standard error stream.
+
+RETURN VALUE
+
+ This function returns a pointer to the array element which is
+ structure of var_data type, which contains variable definition
+ of a given name. It returns NULL on error or failure.
+
+
+4.2 parse_core
+
+NAME
+
+ parse_core
+
+SYNOPSIS
+ static int parse_core (const char *source, struct var_data *vdt,
+ parsefunc outfn, void *result);
+
+DESCRIPTION
+
+ This is the parsing routine for query strings containing the
+ substitution variables. It reads the string pointed with source
+ and tries to catch a valid substitution variables or parts which
+ are plain text blocks. The main purpose of using this function
+ it to split source string into parts and for each part call
+ outfn() function. Those parts are substrings identified by
+ pointer to some element of the source string and size.
+ Those elements are the result of splitting source string into
+ logical parts: plain text substrings and substitution variables'
+ values. To get the values of any found substitution variables
+ parse_core() uses get_variable() function. To find places
+ where substitution variables occurs it uses strstr() function
+ in conjunction with SV_BEGIN_MARK and SV_END_MARK definitions.
+ It passes vdt structure pointer to get_variable() function is
+ it calls it.
+
+ outfn() function should be passed by its pointer which
+ refers to declaration:
+
+ int (*outfn) (const char *begin,
+ size_t string_length,
+ void *void_pointer);
+
+ Each time outfn() is called the result argument of parse_core()
+ is passed to the outfn() as a last argument (void_pointer).
+
+ Example:
+
+ Example string "$(local_part) AND $(domain)" will cause the
+ outfn() to be called 3 times. First time for a value of
+ $(local_part) substitution variable, second time
+ for " AND " string, and the last time for $(domain) variable's
+ value. Variables are passed to outfn() by their (found) values,
+ plain text blocks are passed as they appear.
+
+ This function repports errors by sending human readable
+ messages to the standard error stream.
+
+RETURN VALUE
+
+ This function returns -1 if an error has occured and 0 if
+ everything went good.
+
+4.3 ParsePlugin_counter
+
+NAME
+
+ ParsePlugin_counter
+
+SYNOPSIS
+
+ int ParsePlugin_counter (const char *begin, size_t len,
+ void *vp);
+
+DESCRIPTION
+
+ This is parsing plugin function. It simply increments the value
+ found in the memory area pointed by vp. It assumes that
+ the memory area is allocated for the variable of size_t
+ type and that area was passed by (size_t *) pointer.
+ The value is incremented by len argument. Begin argument
+ is not used.
+
+ This function repports errors by sending human readable
+ messages to the standard error stream.
+
+RETURN VALUE
+
+ This function returns the variable size or -1 if an error
+ has occured, 0 if everything went good.
+
+4.4 ParsePlugin_builder
+
+NAME
+
+ ParsePlugin_builder
+
+SYNOPSIS
+
+ int ParsePlugin_builder (const char *begin, size_t len,
+ void *vp);
+
+DESCRIPTION
+
+ This is parsing plugin function. It simply copies len bytes
+ of a string pointed by begin to the end of memory area pointed by
+ vp. It assumes that the area pointed by vp is passed by (char **)
+ type pointer and refers to the (char *) pointer variable.
+ After each call it shifts the value of pointer variable (char *)
+ incrementing it by len bytes. Be careful when using this function
+ - its changes the given pointer value. Always operate on an
+ additional pointer type variable when passing it as the third
+ argument.
+
+RETURN VALUE
+
+ This function returns the variable size or -1 if an error
+ has occured, 0 if everything went good.
+
+4.5 parse_string
+
+NAME
+ parse_string
+
+SYNOPSIS
+
+ static char *parse_string (const char *source, struct var_data *vdt);
+
+DESCRIPTION
+
+ This function parses the string pointed with source according to the
+ replacement instructions set in var_data array, which is passed with
+ its pointer vdt. It produces changed string located in newly allocated
+ memory area.
+
+ This function calls parse_core() function with various parsing
+ subroutines passed as function pointers.
+
+ 1. It uses parse_core() with ParsePlugin_counter to obtain the
+ total amount of memory needed for the output string.
+
+ 2. It allocates the memory.
+
+ 3. It uses parse_core() with ParsePlugin_builder to build the
+ output string.
+
+ This function repports errors by sending human readable
+ messages to the standard error stream.
+
+RETURN VALUE
+
+ Function returns pointer to the result buffer or NULL
+ if an error has occured.
+
+WARNINGS
+
+ This function allocates some amount of memory using standard
+ ANSI C routines. Memory allocated by this function should be
+ freed with free().
+
+
+4.6 validate_password
+
+NAME
+ validate_password
+
+SYNOPSIS
+
+ static const char *validate_password (const char *password);
+
+DESCRIPTION
+
+ This function checks whether password string does contain
+ any dangerous characters, which may be used to pass command
+ strings to the database connection stream. If it founds one
+ it replaces it by the backslash character.
+
+RETURN VALUE
+
+ It returns a pointer to the static buffer which contains
+ validated password string or NULL if an error has occured.
+
+
+4.7 get_localpart
+
+NAME
+
+ get_localpart
+
+SYNOPSIS
+
+ static const char *get_localpart (const char *username);
+
+DESCRIPTION
+
+ This function detaches local part of an e-mail address
+ from string pointed with username and puts it to the
+ buffer of the fixed length. All necessary cleaning is
+ made on the result string.
+
+RETURN VALUE
+
+ Pointer to the static buffer containing local part or
+ NULL if there was some error.
+
+
+4.8 get_domain
+
+NAME
+
+ get_domain
+
+SYNOPSIS
+
+ static const char *get_domain (const char *username,
+ const char *defdomain);
+
+DESCRIPTION
+
+ This function detaches domain part of an e-mail address
+ from string pointed with username and puts it to the
+ buffer of the fixed length. All necessary cleaning is
+ made on the result string. If function cannot find domain
+ part in the string the string pointed by defdomain is
+ used instead.
+
+RETURN VALUE
+
+ Pointer to the static buffer containing domain name or
+ NULL if there was some error.
+
+
+4.9 parse_select_clause
+
+NAME
+
+ parse_select_clause
+
+SYNOPSIS
+
+ static char *parse_select_clause (const char *clause,
+ const char *username,
+ const char *defdomain);
+
+DESCRIPTION
+
+ This function is a simple wrapper to the parse_string()
+ function. It parses a query pointed by caluse. username
+ and defdomain strings are used to replace corresponding
+ substitution strings if present in the query: $(local_part)
+ and $(domain).
+
+
+RETURN VALUE
+
+ Same as parse_string().
+
+
+4.10 parse_chpass_clause
+
+NAME
+
+ parse_chpass_clause
+
+SYNOPSIS
+
+ static char *parse_chpass_clause (const char *clause,
+ const char *username,
+ const char *defdomain,
+ const char *newpass,
+ const char *newpass_crypt);
+
+DESCRIPTION
+
+ This function is a simple wrapper to the parse_string()
+ function. It parses a query pointed by caluse. username,
+ defdomain, newpass and newpass_crypt strings are used to
+ replace corresponding substitution strings if present in
+ the query: $(local_part), $(domain), $(newpass),
+ $(newpass_crypt).
+
+RETURN VALUE
+
+ Same as parse_string().
+
+
+
+
+
+ *------------------------
+ 5 Ideas and TODO
+ *------------------------
+
+- solve problem with fixed buffer length of local part and the domain part
+ strings after split (problem?)
+- allow admin to set a group name instead of numerical group id
+- allow admin to set a username instead of numerical user id
+
+- add clauses:
+
+ - MYSQL_PRESELECT_CLAUSE (query which comes before MYSQL_SELECT_CLAUSE)
+ - MYSQL_POSTSELECT_CLAUSE (query which comes after MYSQL_SELECT_CLAUSE)
+ - PGSQL_PRESELECT_CLAUSE (query which comes before PGSQL_SELECT_CLAUSE)
+ - PGSQL_POSTSELECT_CLAUSE (query which comes after PGSQL_SELECT_CLAUSE)
+
+
+
+
+
+ *------------------------
+ 6 Thanks
+ *------------------------
+
+At the beginning this patch was messy indeed. :> I would like to thank
+Sam Varshavchik for pointing me a lot how to make it more fast and solid.
+I would also thank Philip Hazel, Chris Lightfoot and Mike Bremford which
+by their software capabilities inspired me to write it.
+
+Thomas T. Thai <tom@minnesota.com> ported author's original MySQL code
+to the PostgreSQL module.
+
+---------------------------------------------------------------------------
+
--- /dev/null
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>Courier PostgreSQL authentication module</title>
+ <meta name="MSSmartTagsPreventParsing" content="TRUE" />
+</head>
+
+<body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B"
+alink="#FF0000">
+<h1>Courier PostgreSQL authentication module</h1>
+
+<p>Please read <a href="README.authmysql.html">README.authmysql.html</a>
+since almost all information there applies to postgres as well, but with
+postgres change the schema to:</p>
+<pre>CREATE TABLE passwd (
+ id varchar(128) DEFAULT '' NOT NULL,
+ crypt varchar(128) DEFAULT '' NOT NULL,
+ clear varchar(128) DEFAULT '' NOT NULL,
+ name varchar(128) DEFAULT '' NOT NULL,
+ uid int DEFAULT 65534 NOT NULL,
+ gid int DEFAULT 65534 NOT NULL,
+ home varchar(255) DEFAULT '' NOT NULL,
+ maildir varchar(255) DEFAULT '' NOT NULL,
+ defaultdelivery varchar(255) DEFAULT '' NOT NULL,
+ quota varchar(255) DEFAULT '' NOT NULL,
+ CONSTRAINT id PRIMARY KEY (id)
+);</pre>
+</body>
+</html>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <title>README</title>
+ <meta name="generator" content="amaya 8.6, see http://www.w3.org/Amaya/" />
+</head>
+
+<body>
+<h1>Courier Authentication Library</h1>
+
+<p>This is the Courier authentication library. Copies of this library code
+used to exist in other tarballs: Courier, Courier-IMAP, and SqWebMail.
+Building and installing any of these packages would've automatically
+installed this authentication code.</p>
+
+<p>The authentication library is now a separate, standalone package. This
+authentication library must now be installed, separately, before upgrading to
+the following builds (or if installing them for the first time): Courier
+0.48, Courier-IMAP 4.0, and SqWebMail 5.0. See <a href="NEWS.html">NEWS</a>
+for more information.</p>
+
+<p>Download: <a target="_blank"
+href="http://www.courier-mta.org/download.php#authlib">http://www.courier-mta.org/download.php#authlib</a></p>
+
+<h2>Overview</h2>
+
+<p>The Courier authentication library provides authentication services for
+other Courier applications. In this context, the term "authentication" refers
+to the following functions:</p>
+<ol>
+ <li>Take a userid or a loginid, and a password. Determine whether the
+ loginid and the password are valid.</li>
+ <li>Given a userid, obtain the following information about the userid:
+ <ol type="A">
+ <li>The account's home directory.</li>
+ <li>The numeric system userid and groupid that owns all files
+ associated with this account.</li>
+ <li>The location of the account's maildir.</li>
+ <li>Any maildir quota defined for this account. See the Courier
+ documentation for more information on maildir quotas.</li>
+ <li>Other miscellaneous account-specific options.</li>
+ </ol>
+ </li>
+ <li>Change the password associated with a loginid.</li>
+ <li>Obtain a complete list of all loginids.</li>
+</ol>
+
+<p>The Courier authentication library provides alternative implementations of
+these authentication services:</p>
+<ol>
+ <li>Use the traditional system password files: <code>/etc/passwd</code> and
+ <code>/etc/shadow</code>, possibly in conjunction with the PAM
+ library.</li>
+ <li>Maintain all this information in a GDBM or a DB database. The GDBM or
+ the DB database is compiled from plain text files. Perl scripts provide a
+ simple interface for creating and editing the authentication information,
+ then a script compiles the plain text files into a database.</li>
+ <li>Use an LDAP server for authentication.</li>
+ <li>Use a table in a MySQL database for authentication.</li>
+ <li>Use a table in a PostgreSQL database for authentication.</li>
+</ol>
+
+<p>All Courier components that use this authentication library, therefore,
+will be able to authenticate E-mail accounts
+using any of the above methods.</p>
+
+<p>Additional information can be found in the <a
+href="INSTALL.html">INSTALL</a> file.</p>
+
+<p>The authentication API is <a href="authlib.html">documented</a>.</p>
+
+<h2>Further resources</h2>
+
+<p>Subscribe to the courier-users mailing list: <a
+href="http://lists.sourceforge.net/lists/listinfo/courier-users"><code>http://lists.sourceforge.net/lists/listinfo/courier-users</code></a>.</p>
+
+<p></p>
+</body>
+</html>
--- /dev/null
+LDAP support based on a patch by:
+Luc Saillard <luc.saillard@alcove.fr> Thu, 30 Dec 1999 20:33:08 +0100
+
+Adapted as a generic authlib authentication module - SV 12/31/99.
+
+Configuration File
+------------------
+
+ LDAP configuration is placed in the file authldaprc, which is installed,
+ by default, as /usr/lib/courier-imap/etc/authldaprc.
+ Use --with-authldaprc=pathname to override the location.
+
+ This file must be owned by root and have the permissions set to 0400
+ because the LDAP administrator password is stored in this file.
+
+ See the default authldaprc for more information.
+
+ CC both me and Luc Saillard for questions on authldap.
+
+Schema
+------
+
+OpenLDAP 2.0 defaults to schema checking on all directories. The file
+authldap.schema contains a definition of a LDAP objects
+CourierMailAccount, CourierMailAlias, and CourierDomainAlias.
+
+Only CourierMailAccount is used for mailbox authentication (i.e. IMAP,
+webmail). The other two objects are used by LDAP-based mail routing
+in the Courier Mail Server.
+
+Here are some sample LDAP objects that use this schema:
+
+dn: o=example, c=com
+ObjectClass: organization
+o: example
+c: com
+
+dn: mail=xyz123@example.com, o=example, c=com
+ObjectClass: CourierMailAccount
+mail: xyz123@example.com
+mail: xyz123
+clearPassword: tux
+userPassword: {MD5}WrbkuYvH+3FvwH7Zj+34Ag==
+homeDirectory: /home/xyz123
+uidNumber: 1001
+gidNumber: 1001
+
+dn: mail=mailalias@example.com, o=example, c=com
+ObjectClass: CourierMailAlias
+mail: mailalias
+maildrop: xyz123
+
+dn: virtualdomain=domain.com, o=example, c=com
+ObjectClass: CourierDomainAlias
+virtualdomain: domain.com
+virtualdomainuser: wxyz456
+
+
+Notice on Luc's original patch:
+-------------------------------
+
+ Copyright (C) 1999 Luc Saillard
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
--- /dev/null
+<?xml version="1.0"?>
+<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>Courier Authentication Library</title><link rel="stylesheet" href="style.css" type="text/css"/><meta name="generator" content="DocBook XSL Stylesheets V1.72.0"/><link rel="start" href="#authlib" title="Courier Authentication Library"/><link rel="next" href="#authpwd" title="The authpwd authentication module"/><link xmlns="" rel="stylesheet" type="text/css" href="manpage.css"/><meta xmlns="" name="MSSmartTagsPreventParsing" content="TRUE"/><link xmlns="" rel="icon" href="icon.gif" type="image/gif"/><!--
+
+Copyright 1998 - 2007 Double Precision, Inc. See COPYING for distribution
+information.
+
+--></head><body><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h1 class="title"><a id="authlib" shape="rect"> </a>Courier Authentication Library</h1></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#authpwd" shape="rect">The <code class="literal">authpwd</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authshadow" shape="rect">The <code class="literal">authshadow</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpam" shape="rect">The <code class="literal">authpam</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpipe" shape="rect">The <code class="literal">authpipe</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpipeproto" shape="rect">The <code class="literal">authpipe</code> protocol</a></span></dt><dt><span class="sect1"><a href="#authuserdb" shape="rect">The <code class="literal">authuserdb</code> authentication module</a></span></dt><dd><dl><dt><span class="sect2"><a href="#userdbprimer" shape="rect">A brief <code class="literal">userdb</code> primer</a></span></dt><dt><span class="sect2"><a href="#userdbsimple" shape="rect">A simple userdb setup</a></span></dt><dt><span class="sect2"><a href="#userdbcomplex" shape="rect">Large virtual domain farm</a></span></dt><dt><span class="sect2"><a href="#moreuserdb" shape="rect">Beyond <code class="literal">userdb</code></a></span></dt></dl></dd><dt><span class="sect1"><a href="#authvchkpw" shape="rect">The <code class="literal">authvchkpw</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authmysql" shape="rect">The <code class="literal">authmysql</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpgsql" shape="rect">The <code class="literal">authpgsql</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authldap" shape="rect">The <code class="literal">authldap</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authcustom" shape="rect"><code class="literal">authcustom</code></a></span></dt><dt><span class="sect1"><a href="#options" shape="rect">Account options</a></span></dt><dt><span class="sect1"><a href="#authtest" shape="rect">Running <span><strong class="command">authtest</strong></span></a></span></dt><dd><dl><dt><span class="sect2"><a href="#pwchange" shape="rect">Changing account passwords</a></span></dt></dl></dd><dt><span class="sect1"><a href="#internals" shape="rect">Authentication internals</a></span></dt><dt><span class="sect1"><a href="#files" shape="rect">FILES</a></span></dt><dt><span class="sect1"><a href="#seealso" shape="rect">SEE ALSO</a></span></dt></dl></div><p>
+This library is used for two purposes:</p><p>
+1. Read the name of a mail account.
+Determine the local account's home directory, and system userid and
+groupid.</p><p>
+2. Read an account name, and a password.
+If valid, determine the account's home directory, system userid, and
+groupid.</p><p>
+The term "authentication" is used in the following documentation to refer
+to either one of these two functions.
+The library contains several alternative authentication modules to choose
+from, described below.</p><p>
+The configuration file <code class="filename">@authdaemonrc@</code> contains several
+settings. The most important of them are:</p><div class="itemizedlist"><ul type="disc"><li><p>
+A list of authentication modules to activate.
+By default, this list includes all available authentication modules,
+even if some are not actually installed at the moment.
+When the authentication library is set up, only those authentication
+modules that can be supported by the operating system will be installed.
+Some of the listed modules may not actually be there,
+however that's not a problem.
+Any unavailable authentication modules will be ignored.
+Also, on some platforms certain authentication modules are installed by
+optional sub-packages.
+Installing the sub-package is the only action needed to make use of it.</p><p>
+The only time the list of authentication modules need to be adjusted is
+when an available authentication module must be disabled for some reason.
+This should only be needed in the most unusual circumstances.</p></li><li><p>
+Number of authentication processes.
+The default setting is to start five authentication processes, which should be
+sufficient for normal usage.
+Try increasing this setting if its taking too long to log into an account,
+and you have determined that this is not due to a bottleneck in the whatever
+authentication database you're using (LDAP, MySQL, or PostgreSQL).</p><p>
+An authentication request must be completed within thirty seconds, otherwise
+it gets rejected.
+When authentication requests come in faster than all five authentication
+processes can get to them, delays build up, and the timer is ticking.
+If all the activity maxes out the CPU or I/O bandwidth,
+nothing can be done about it, short
+of getting another server. However if there's plenty of available CPU and
+I/O, increasing the number of processes will do the trick.</p></li></ul></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authpwd" shape="rect"> </a>The <code class="literal">authpwd</code> authentication module</h2></div></div></div><p>
+This modules obtains account information and passwords from the
+<code class="filename">/etc/passwd</code> file.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
+This module doesn't actually read the <code class="filename">/etc/passwd</code>
+file, it uses the C library's getpw() functions.
+The C library implementation could use any mechanism to obtain the equivalent
+information.</p></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authshadow" shape="rect"> </a>The <code class="literal">authshadow</code> authentication module</h2></div></div></div><p>
+This module is a version of the <code class="literal">authpwd</code> module that
+reads passwords
+from <code class="filename">/etc/shadow</code> (the C library's getsp()
+functions).</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authpam" shape="rect"> </a>The <code class="literal">authpam</code> authentication module</h2></div></div></div><p>
+This modules uses the system's PAM library
+(pluggable authentication modules) for authentication.
+This is, essentially, a way to use existing PAM modules for authentication.
+Note, however, that the authenticated account's home directory, userid and
+groupid are still read from the <code class="filename">/etc/passwd</code> file,
+since PAM functionality is limited to validating account passwords.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
+Not all PAM modules are compatible with Courier's authentication library.
+PAM modules that make use of PAM's session functions, or authentication token
+functions, like <code class="literal">pam_krb5</code> will not work with Courier.</p></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
+Additional configuration steps will be required to set up
+the PAM library to authenticate Courier's services.
+Courier's IMAP and POP3 servers, for example, require that the
+“<span class="quote">imap</span>” and “<span class="quote">pop3</span>” PAM service to be
+configured.</p><p>
+The specific configuration steps differ from system to system.
+Consult the system documentation for more information.
+It might be tempting to throw in a towel and use
+<code class="literal">authshadow</code> or <code class="literal">authpwd</code>
+if you cannot figure out how to install PAM support,
+however that is not advisable.
+It is highly recommended to use
+<code class="filename">authpam</code> wherever the PAM library is available.</p><p>
+The exact configuration procedure depends on the PAM implementation.
+Most PAM libraries use configuration files in the
+<code class="filename">/etc/pam.d</code> directory.
+Therefore, it will be necessary to install the configuration files
+<code class="filename">/etc/pam.d/imap</code> and
+<code class="filename">/etc/pam.d/pop3</code>. Similarly, Courier's webmail
+server, SqWebMail, uses <code class="filename">/etc/pam.d/webmail</code>, and
+its optional calendar component uses <code class="filename">/etc/pam.d/webmail</code>.
+Courier-MTA's authenticated SMTP component uses the
+<code class="filename">/etc/pam.d/smtp</code> service.</p><p>
+In nearly all cases all these configuration files will specify an
+identical PAM library configuration for all services.
+The exact configuration details are site-specific.
+Here's an example of a PAM configuration file for a recent version of the
+most common PAM library:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+auth required pam_nologin.so
+auth required pam_stack.so service=system-auth
+account required pam_stack.so service=system-auth
+session required pam_stack.so service=system-auth
+</pre></div><p>
+Again, the actual configuration is site specific.
+Examine the contents of existing configuration files in
+<code class="filename">/etc/pam.d</code> for similar services (if there's
+<code class="filename">/etc/pam.d/ppp</code>
+it's often a good example to follow) in order
+to derive the correct setup for Courier.</p><p>
+Older PAM libraries use a single configuration file, usually
+<code class="filename">/etc/pam.conf</code>.
+Append Courier-specific PAM settings to this configuration file, again
+using settings for existing services as a guide.
+For example:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+imap auth required pam_unix.so try_first_pass
+imap account required pam_unix.so
+imap session required pam_permit.so
+pop3 auth required pam_unix.so try_first_pass
+pop3 account required pam_unix.so
+</pre></div><p>
+Some PAM libraries use
+<code class="filename">pam_pwdb.so</code> instead of
+<code class="filename">pam_unix.so</code>; consult the PAM library's
+documentation for more information.</p></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authpipe" shape="rect"> </a>The <code class="literal">authpipe</code> authentication module</h2></div></div></div><p>This is a generic plug-in module that runs an external script,
+or a program, in response to authentication requests.</p><p>The external program reads from stdin and writes to stdout. It
+can be persistent and handle many authentication requests. Only one request
+will be sent to it at a time; each authdaemon process starts its own copy of
+the external script.</p><p>The location of the external program is set by the
+<code class="literal">--with-pipeprog</code> configure option,
+which defaults to
+<code class="filename">@sysconfdir@/authlib/authProg</code>. A sample program
+is included in the courier-authlib source.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authpipeproto" shape="rect"> </a>The <code class="literal">authpipe</code> protocol</h2></div></div></div><p>
+authpipe uses the same protocol as authdaemon clients use to communicate
+with authdaemond.</p><p>There are four possible requests: <code class="literal">PRE</code>,
+<code class="literal">AUTH</code>, <code class="literal">PASSWD</code> and
+<code class="literal">ENUMERATE</code>. Apart from <code class="literal">AUTH</code>, each
+request is a single line terminated by newline.
+</p><div class="variablelist"><dl><dt><span class="term">PRE . <em class="replaceable"><code>authservice</code></em> <em class="replaceable"><code>username</code></em> <span class="emphasis"><em><newline></em></span></span></dt><dd><p>Look up data for an account.
+ <em class="replaceable"><code>authservice</code></em> identifies the service the
+ user is trying to use - e.g. pop3, imap, webmail etc.</p><p>If the account exists, return the account
+ data as a series of ATTR=value newline-terminated lines, followed by a
+ period on a line of its own. Valid attributes are:
+ </p><pre class="screen" xml:space="preserve">
+ USERNAME=username -- system account which owns mailbox (name)
+ UID=uid -- system account which owns mailbox (numeric uid)
+ GID=gid -- numeric groupid
+ HOME=homedir -- home directory
+ ADDRESS=addr -- e-mail address
+ NAME=name -- full name
+ MAILDIR=maildir -- Maildir relative to home directory
+ QUOTA=quota -- quota string: maxbytesS,maxfilesC
+ PASSWD=cryptpasswd -- encrypted password
+ PASSWD2=plainpasswd -- plain text password
+ OPTIONS=acctoptions -- option1=val1,option2=val2,...
+ .
+ </pre><p>
+ Of these, it is mandatory to return ADDRESS, HOME, GID, and either UID
+ or USERNAME; the others are optional.
+ </p><p>If the account is not known, return <code class="literal">FAIL</code><span class="emphasis"><em><code class="literal"><newline></code></em></span>.
+ If there is a temporary failure, such as a database being down, authProg
+ should terminate (thereby closing stdin/stdout) without sending any
+ response. authdaemon will restart the pipe module for the next
+ request, thus ensuring it is properly reinitialized.
+ </p></dd><dt><span class="term">AUTH <em class="replaceable"><code>len</code></em><span class="emphasis"><em><newline></em></span><em class="replaceable"><code>len-bytes</code></em></span></dt><dd><p>
+ Validate a login attempt. The AUTH line is followed by
+ <span class="emphasis"><em>len-bytes</em></span> of authentication data, which does not
+ necessarily end with a newline. The currently defined authentication
+ requests are:
+ </p><pre class="screen" xml:space="preserve">
+ login \n username \n password [\n] -- plaintext login
+ cram-md5 \n challenge \n response [\n] -- base-64 encoded challenge and response
+ cram-sha1 \n challenge \n response [\n] -- ditto
+ cram-sha256 \n challenge \n response [\n] -- ditto
+ </pre><p>
+ In the case of success, return the complete set of
+ account parameters in the same format as PRE, ending with a period on
+ a line of its own. In the case of failure (e.g. username does not exist,
+ password wrong, unsupported authentication type), return
+ <code class="literal">FAIL</code><span class="emphasis"><em><code class="literal"><newline></code></em></span>.
+ If there is a temporary failure, such as a database being down, authProg
+ should terminate without sending any response.
+ </p><p>
+ Note: if the user provides a plaintext password and authenticates
+ successfully, then you can return it as PASSWD2 (plain text password)
+ even if the database contains an encrypted password. This is useful
+ when using the POP3/IMAP proxy functions of courier-imap.
+ </p></dd><dt><span class="term">PASSWD <em class="replaceable"><code>service</code></em><span class="emphasis"><em><tab></em></span>
+ <em class="replaceable"><code>username</code></em><span class="emphasis"><em><tab></em></span>
+ <em class="replaceable"><code>oldpasswd</code></em><span class="emphasis"><em><tab></em></span>
+ <em class="replaceable"><code>newpasswd</code></em><span class="emphasis"><em><tab></em></span>
+ <span class="emphasis"><em><newline></em></span>
+ </span></dt><dd><p>Request a password change for the given account: validate that
+ the oldpassword is correct, and if so, change it to the newpassword.
+ </p><p>Reply: the string
+ for success, or <code class="literal">FAIL</code><span class="emphasis"><em><code class="literal"><newline></code></em></span> for
+ a data error (e.g. no such account, old password wrong, new password not
+ acceptable). In the case of a temporary failure, such as a database
+ being down, authProg should terminate without sending any response.
+ </p></dd><dt><span class="term">ENUMERATE <span class="emphasis"><em><newline></em></span></span></dt><dd><p>
+ Return a list of all accounts, one per line in the following format,
+ ending with a period on a line of its own:
+ </p><pre class="screen" xml:space="preserve">
+ username \t uid \t gid \t homedir \t maildir \t options \n
+ .
+ </pre><p>
+ If your module does not support the ENUMERATE command then return just
+ a period on a line of its own (which will still allow enumeration data
+ from other modules to be returned). In the case of a temporary failure,
+ such as a database being down or an error occuring mid-way through
+ returning account data, authProg should terminate before sending
+ the terminating period.
+ </p></dd></dl></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authuserdb" shape="rect"> </a>The <code class="literal">authuserdb</code> authentication module</h2></div></div></div><p>
+This module
+uses a GDBM or a DB-based
+<a href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a> database.
+This module also incorporates userdb-based challenge-response authentication
+implementation that was done by a separate <code class="literal">authcram</code> module
+in previous versions of the Courier authentication library.</p><p>
+<code class="filename">@sysconfdir@/authlib/userdb</code> is a plain file that
+can be edited with any text editor.
+The file contains a list of account names, and their pertinent information.
+<code class="filename">@sysconfdir@/authlib/userdb</code> may alternatively be a
+directory containing plain text files, which are effectively concatenated
+together to form the actual list of accounts.
+The <span><strong class="command">makeuserdb</strong></span> script compiles the account information
+into a GDBM or DB database file, which can be quickly looked up.</p><p>
+<code class="filename">@sysconfdir@/authlib/userdb</code> is loosely equivalent in
+function to <code class="filename">/etc/passwd</code> and
+<code class="filename">/etc/shadow</code>, and contain analous information: account
+name, its numeric userid and groupid, home directory, and passwords.
+<code class="filename">@sysconfdir@/authlib/userdb</code> also contains additional
+Courier-specific metadata, such as account quotas and other account-specific
+settings.
+<code class="filename">@sysconfdir@/authlib/userdb</code> files can also be
+maintained by custom-written Perl scripts, instead of being edited
+by hand.</p><p>
+<code class="filename">@sysconfdir@/authlib/userdb</code>
+allows creation of virtual mail accounts that do not have a corresponding
+login account -- virtual mail accounts that can share the same, reserved,
+system userid.
+<code class="filename">@sysconfdir@/authlib/userdb</code>
+can also be used to completely supersede
+<code class="filename">/etc/passwd</code>.
+With many accounts it can be quite a drain to have to continuously linearly
+scan <code class="filename">/etc/passwd</code> in order to look up an account.
+Instead, a fast database lookup can retrieve the same information from the
+database file.
+Review the included manual pages, starting with
+<a href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a>, for more information.</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="userdbprimer" shape="rect"> </a>A brief <code class="literal">userdb</code> primer</h3></div></div></div><p>
+<code class="literal">userdb</code> is a way to implement many virtual mailboxes - many
+mailboxes that do not have to have a separate system userid allocated for
+each one, and there is no system login associated with each mailbox.
+<code class="literal">userdb</code> uses a database for mapping virtual addresses to physical
+maildirs. It should be scalable to thousands of mailboxes. It can also be
+used to replace linear searches of <code class="filename">/etc/passwd</code> with a database
+lookup, see
+<a href="pw2userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">pw2userdb</span>(8)</span></a>.</p><p>
+Note - you still MUST use some valid system userid and groupid that is
+shared by all virtual mailboxes. Instead of allocating a single userid and
+groupid per each mailbox, the same userid and groupid is used for all of
+them.</p><p>
+This is a rough overview of using userdb. For additional information, read
+<a href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a>
+and
+<a href="makeuserdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">makeuserdb</span>(8)</span></a>. All the scripts will
+be installed in <code class="filename">@sbindir@</code>, so look for them there.</p><p>
+The best way to describe how <code class="literal">userdb</code> works is to try to create
+one virtual mail account. As mentioned before, virtual mailboxes still need
+one system account to be used for uid/gid purposes. Let's call this system
+account "vmail".</p></div><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="userdbsimple" shape="rect"> </a>A simple userdb setup</h3></div></div></div><p>
+This approach should be used if you do not have many virtual mailboxes.
+It's very simple, but quickly becomes cumbersome if you administer many
+virtual mailboxes.</p><p>Create an empty <code class="filename">@userdb@</code> file:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+# cp /dev/null @userdb@
+# chmod 700 @userdb@</pre></div><p>
+<code class="filename">@userdb@</code> must have 700 permissions,
+since it will contain passwords.</p><p>
+Now, run the script <span><strong class="command">pw2userdb</strong></span>, as root.
+This script converts the
+contents of <code class="filename">/etc/passwd</code>
+to the <code class="filename">@userdb@</code> format
+(including the contents of <code class="filename">/etc/shadow</code>,
+this is why permissions
+on <code class="filename">@userdb@</code> must be 700). This script is usually used
+where you
+want to convert a very large <code class="filename">/etc/passwd</code> to
+<code class="filename">@userdb@</code>. <code class="literal">userdb</code> applications can now
+use a fast
+<code class="literal">userdb</code> database instead of a linear scan
+of <code class="filename">/etc/passwd</code>
+in order to look up system accounts. However, you probably don't want to
+use this feature right now, so what you want to do is take the output
+of <span><strong class="command">pw2userdb</strong></span>, and find the entry for the vmail account
+that you
+created earlier. Look for a line that starts with 'vmail' followed by tab,
+followed by familiar fields from <code class="filename">/etc/passwd</code>. Save the
+output of
+<span><strong class="command">pw2userdb</strong></span> in a temporary file, edit it, and remove
+everything
+except the line containing vmail, and the very next line, which is a special
+entry that maps vmail's userid back to the vmail record.</p><p>
+Here's what you might find in the output of
+<span><strong class="command">pw2userdb</strong></span>:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+vmail uid=1012|gid=1012|home=/home/vmail|systempw=*
+1012= vmail</pre></div><p>
+The actual numerical values and the home directory location may vary.
+Save
+these two lines as <code class="filename">@userdb@</code>, and set the permissions on
+<code class="filename">@userdb@</code> to 700:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+$ chmod 700 <code class="filename">@userdb@</code>
+</pre></div><p>
+Now, with that out of the way, let's really create a virtual account. In
+this example we'll create a virtual mailbox for 'john@example.com'.</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+# su vmail
+$ cd ~vmail
+$ mkdir john-example
+$ maildirmake john-example/Maildir
+$ exit
+#
+</pre></div><p>
+You may need to specify a full path to your <span><strong class="command">maildirmake</strong></span>
+program. The end result is that you created
+<code class="filename">$HOME/john-example</code> in vmail's account, which
+can be thought of as a “<span class="quote">virtual home directory</span>” for
+“<span class="quote">john@example.com</span>”, that contains the account's maildir
+mailbox.</p><p>
+Now, let's connect the dots here, and create an entry in
+<code class="filename">@userdb@</code> for <code class="filename">john@example.com</code>:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+# userdb "john@example.com" set home=/home/vmail/john-example \
+ uid=UUU gid=GGG
+</pre></div><p>
+This command runs the script named <code class="filename">userdb</code> , which is
+installed, by default in <code class="filename">@sbindir@</code>. Replace UUU and
+GGG with the userid and groupid of the vmail account. If you now look in
+<code class="filename">@userdb@</code>, you will see that a new record for
+“<span class="quote">john@example.com</span>”
+has been appended to the end of the file.</p><p>
+One more detail: we need to set the IMAP password for this
+mailbox:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+# userdbpw | userdb "john@example.com" set imappw</pre></div><p>
+On most modern Linux and BSD distributions, you can specify the -md5
+option to <span><strong class="command">userdbpw</strong></span>, in order to use MD5 password hashes,
+instead of crypt. The traditional password function allows passwords only
+up to 8 characters long; everything in excess is ignored.
+The newer MD5 passwords, now supported by most modern systems, allow
+longer passwords.</p><p>
+Use "<code class="literal">systempw</code>" instead of
+"<code class="literal">imappw</code>" if you would like to use the same password for the POP3
+server, and for all other services.
+The "<code class="literal">imappw</code>" field is only checked by the IMAP server.
+If not
+defined, "<code class="literal">systempw</code>" is used instead. The field
+<code class="literal">pop3pw</code>
+is checked only by Courier's POP3 server. If it is
+not defined the POP3 server will check <code class="literal">systempw</code> too.</p><p>Finally, compile the database:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+# makeuserdb
+</pre></div><p>
+This command creates the actual database, <code class="filename">@userdb@.dat</code> and
+<code class="filename">@userdb@shadow.dat</code> from the plain text file
+<code class="filename">@userdb@</code>. Courier will now start accepting logins to this
+mailbox. Adding and removing mailboxes can be done while Courier is
+running.</p><p>
+Courier reads <code class="filename">@userdb@.dat</code> and
+<code class="filename">@userdb@shadow.dat</code> only. The plain text source,
+<code class="filename">@userdb@</code> is not read by Courier itself. Changes take
+effect
+only when <span><strong class="command">makeuserdb</strong></span> runs.</p></div><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="userdbcomplex" shape="rect"> </a>Large virtual domain farm</h3></div></div></div><p>
+The previous approach used a single flat file, <code class="filename">@userdb@</code>.
+This
+will work for up to a couple of hundred accounts.
+An slightly different approach can scale to thousands of
+domains and mailboxes.</p><p>
+Instead of creating a <code class="filename">@userdb@</code> file, create a
+subdirectory:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+# mkdir @userdb@
+# chmod 700 @userdb@
+</pre></div><p>
+Now, create <code class="filename">@userdb@/default</code>, containing pw2userdb's
+output
+for the vmail account, as previously described.</p><p>
+This time, you probably want to create all mailboxes for the same domain
+in a separate subdirectory:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+# su - vmail
+$ cd ~vmail
+$ mkdir -p domains/example-com
+$ mkdir domains/example-com/john
+$ maildirmake domains/example-com/john
+$ exit
+</pre></div><p>
+The idea is that all the maildirs for <code class="literal">@example.com</code> will
+now be found
+in <code class="filename">~vmail/domains/example-com</code>. All maildirs for
+<code class="literal">domain.org</code> will be in
+<code class="filename">~vmail/domains/domain.org</code>. The actual layout and naming
+conventions are entirely up to you to define.</p><p>Here's how configure <code class="filename">@userdb@</code>:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+$ userdb "example-com/john@example.com" set \
+ home=/home/vmail/domains/example-com/john \
+ uid=UUU gid=GGG</pre></div><p>
+This creates the file <code class="filename">@userdb@/example-com</code> (the first
+parameter to the <span><strong class="command">userdb</strong></span> command), and appends a record named
+"john@example.com". You will store all <code class="literal">userdb</code> entries for
+<code class="literal">@example.com</code> in the file
+<code class="filename">@userdb@/example-com</code>. All
+entries for <code class="literal">@domain.org</code> will be maintained in
+<code class="filename">@userdb@/domain-org</code>, and so on.</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+$ userdbpw | userdb "example-com/john@example.com" set imappw
+</pre></div><p>
+This sets the IMAP access password for this account. Finally:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+$ makeuserdb
+</pre></div></div><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="moreuserdb" shape="rect"> </a>Beyond <code class="literal">userdb</code></h3></div></div></div><p>
+<code class="literal">userdb</code> is a simple, straightforward solution that scales
+to a couple of thousand of mail accounts, depending on the hardware.
+Beyond that, one of database-based modules will need to be used,
+such as
+<code class="literal">authldap</code>,
+<code class="literal">authmysql</code>,
+<code class="literal">authpgsql</code>.
+Since <code class="literal">userdb</code> is maintained as plain text files that
+are easily parsed by a script, migrating data from userdb will not be
+difficult.</p></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authvchkpw" shape="rect"> </a>The <code class="literal">authvchkpw</code> authentication module</h2></div></div></div><p>
+This module uses
+the <code class="literal">vpopmail/vchkpw</code> library for authentication.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authmysql" shape="rect"> </a>The <code class="literal">authmysql</code> authentication module</h2></div></div></div><p>
+This module reads
+the list of mail accounts and passwords from a table in a
+MySQL database.
+The <code class="filename">@authmysqlrc@</code> configuration file defines the
+particular details regarding the MySQL database and the schema of the
+mail account table.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authpgsql" shape="rect"> </a>The <code class="literal">authpgsql</code> authentication module</h2></div></div></div><p>
+This module reads
+the list of mail accounts and passwords from a table in a
+PostgreSQL database.
+The <code class="filename">@authpgsqlrc@</code> configuration file defines the
+particular details regarding the PostgreSQL database and the schema of the
+mail account table.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authldap" shape="rect"> </a>The <code class="literal">authldap</code> authentication module</h2></div></div></div><p>
+This module reads
+the list of mail accounts and passwords from an LDAP directory.
+The <code class="filename">@authldaprc@</code> configuration file defines the
+particular details regarding the LDAP directory layout.</p><p>
+A suggested LDAP schema can be found in the file
+<code class="filename">authldap.schema</code>,
+which is included in Courier authentication library's source code, and
+may be installed on your system.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authcustom" shape="rect"> </a><code class="literal">authcustom</code></h2></div></div></div><p>
+This is a do-nothing module where custom authentication code
+can be added.
+This authentication module is just a stub that doesn't really do anything.
+It's purpose is to serve as a placeholder where custom authentication code
+can be easily implement.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="options" shape="rect"> </a>Account options</h2></div></div></div><p>
+The authentication library has a facility for keep arbitrary
+“<span class="quote">name=value</span>”-type settings,
+called “<span class="quote">options</span>”, for individual accounts. This feature is
+only available with
+<code class="literal">userdb</code>,
+<code class="literal">LDAP</code>, <code class="literal">MySQL</code>, and
+<code class="literal">PostgresSQL</code>
+modules. Individual account options are not supported with
+system-based authentication modules (password/shadow files, or PAM).</p><p>
+See the
+<a href="auth_generic.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">auth_generic</span>(3)</span></a>
+for a description of option names used by various Courier packages.
+Other applications can make up names for their own settings, and
+use them in the same way.</p><p>
+Account options are specified via the authentication modules in the
+following manner:</p><div class="variablelist"><dl><dt><span class="term"><code class="literal">userdb</code></span></dt><dd><p>
+Use the <span><strong class="command">userdb</strong></span> command to set a field called
+"<code class="literal">options</code>". Example:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+userdb user1@example.com set options=disableimap=1,sharedgroup=44
+makeuserdb
+</pre></div><p>
+The option text string here is
+"<code class="literal">disableimap=1,sharedgroup=44</code>".
+It specifies two options.</p></dd><dt><span class="term"><code class="literal">LDAP</code></span></dt><dd><p>
+Account options are defined by the <code class="literal">LDAP_AUXOPTIONS</code>
+setting in the <code class="filename">authldaprc</code> configuration file.
+<code class="literal">LDAP_AUXOPTIONS</code> consists of a comma-separated list of
+"<code class="literal">attribute=setting</code>". "attribute" is the name of an LDAP
+attribute, and "setting" is the corresponding account setting name. The
+value of the attribute becomes the value of the setting. Unless you
+value your sanity, the names of LDAP attributes should be the same as
+the actual setting names (in which case "=setting" may be dropped and
+<code class="literal">LDAP_AUXOPTIONS</code> becomes a simple comma-separated list of
+supported settings), but they don't have to be.</p><p>
+<code class="literal">LDAP_AUXOPTIONS</code> is nothing more than a simple mapping
+of LDAP attributes to account settings. A <code class="literal">LDAP_AUXOPTIONS</code>
+of "shared=sharedgroup,disableimap" means that the LDAP attribute
+called "shared" contains the "sharedgroup" setting, as described
+previously; and an LDAP attribute of disableimap contains the setting
+of the same name.</p></dd><dt><span class="term"><span class="application">MySQL</span>, and <span class="application">PostgreSQL</span></span></dt><dd><p>
+Account options are defined by <code class="literal">MYSQL_AUXOPTIONS_FIELD</code>
+or <code class="literal">POSTGRESQL_AUXOPTIONS_FIELD</code>, in its corresponding
+configuration file. In the most simplest case, add a character field to
+the database, and put the field name into the
+<code class="literal">MYSQL_AUXOPTIONS_FIELD</code> or
+<code class="literal">POSTGRESQL_AUXOPTIONS_FIELD</code> configuration file setting.
+For each account, the character field should contain the literal option
+string. Yes, you'll just put "shared=sharedgroup,disableimap"
+literally, in that field.</p><p>
+Fortunately, there is a cleaner way to do this, which avoid driving
+a database designer batty. Keep in mind that the contents of
+<code class="literal">MYSQL_AUXOPTIONS_FIELD</code>/<code class="literal">POSTGRESQL_AUXOPTIONS_FIELD</code>
+are simply inserted directly into the SQL query that fetches the
+account information. Both MySQL and PostgreSQL have a rich SQL that can
+be used to manufacture a suitable option string from plain,
+garden-variety, database fields. That is, you may define individual
+table fields like "disableimap", and "disablepop3", then provide a
+suitable (albeit ugly) SQL fragment that combines them together into
+the expected option string. An example of such an SQL string is
+provided in the comments portion of the configuration file.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
+When using the alternative custom query option, the option string
+ is the last field that the custom SQL query should return.</p></div></dd></dl></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authtest" shape="rect"> </a>Running <span><strong class="command">authtest</strong></span></h2></div></div></div><p>
+The <span><strong class="command">authtest</strong></span> command may be used to verify that the
+authentication library is working:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+authtest userid
+authtest userid password
+authtest userid password newpassword
+authenumerate</pre></div><p>
+Running
+<span><strong class="command">authtest</strong></span>
+with one argument should display the selected account's
+home directory, userid, groupid,
+and other related data.
+The second argument to
+<span><strong class="command">authtest</strong></span>,
+if supplied, specifies the account's password.
+The two argument form of
+<span><strong class="command">authtest</strong></span>
+validates the password, and displays an indication whether the given
+password is valid, or not.
+The three argument form of the
+<span><strong class="command">authtest</strong></span>
+command attemps to change the account's password.
+The second argument is the old password, the third argument is the
+new password.</p><p>
+See <a href="README.authdebug.html" target="_top" shape="rect"><code class="filename">README.authdebug.html</code></a> for more information.</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="pwchange" shape="rect"> </a>Changing account passwords</h3></div></div></div><p>For the virtual domain modules (<code class="literal">authldap</code>,
+<code class="literal">authmysql</code>, <code class="literal">authpgsql</code> and friends) changing the
+login is a no-brainer. The tricky situation is when SqWebMail uses system
+passwords to log in (the <code class="literal">authpwd</code>, <code class="literal">authshadow</code>, or
+<code class="literal">authpam</code> authentication module). Different systems use different
+ways to keep login passwords. Many systems use the traditional
+<code class="filename">/etc/passwd</code> and <code class="filename">/etc/shadow</code> files. Other systems
+use a binary database; other systems use NIS. And on some systems the
+password file lookup library is a wrapper that goes against an external LDAP
+directory, or a database. For maximum compatibility, SqWebMail changes login
+passwords by running the <span><strong class="command">passwd</strong></span> command. This is the traditinal
+*nix command that changes login passwords. <span><strong class="command">passwd</strong></span> is an
+interactive command. It's normally run from a terminal.
+ SqWebMail uses an
+<span><strong class="command">expect</strong></span> script - as mentioned in
+the introduction - to answer interactive
+prompts from <span><strong class="command">passwd</strong></span>. The <span><strong class="command">expect</strong></span> script expects to
+get a plain, garden-variety, <span><strong class="command">passwd</strong></span> command, which acts
+something like this:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+ # passwd
+ Changing password for luser
+ (current) UNIX password: (old password typed here)
+ New UNIX password: (new password typed here)
+ Retype new UNIX password: (new password retyped here)
+ passwd: all authentication tokens updated successfully
+ #
+</pre></div><p>
+Systems that use a <span><strong class="command">passwd</strong></span> command with very different prompts
+may find that the default <span><strong class="command">expect</strong></span> script will fail. In which case
+it will be necessary to tweak the <span><strong class="command">expect</strong></span> script to match the
+prompts from the system's <span><strong class="command">passwd</strong></span> command.</p><p>
+Modern systems use a <span><strong class="command">passwd</strong></span> command that rejects "bad"
+passwords - passwords that are based on dictionary words, are too short, or
+are obvious for other reasons. When testing the ability to change
+system passwords be sure to use randomly-generated gibberish for the test
+passwords. Otherwise, the default <span><strong class="command">expect</strong></span> script will
+actually be
+working, but you won't be the wiser. For security reasons, the actual
+messages from <span><strong class="command">passwd</strong></span> will not be shown by.</p><p>
+The <span><strong class="command">expect</strong></span> script is installed as
+<code class="filename">/usr/local/libexec/courier-authlib/authsystem.passwd</code>
+(assuming default options to the <span><strong class="command">configure</strong></span> script).</p></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="internals" shape="rect"> </a>Authentication internals</h2></div></div></div><p>
+The following structure describes an authentication module:</p><div class="blockquote"><blockquote class="blockquote"><div class="example"><a id="authstaticinfo" shape="rect"> </a><p class="title"><b>Example 1. struct authstaticinfo</b></p><div class="example-contents"><pre class="programlisting" xml:space="preserve">
+struct authstaticinfo {
+ const char *auth_name;
+ int (*auth_func)(const char *, const char *, char *, int,
+ int (*)(struct authinfo *, void *),
+ void *);
+ int (*auth_prefunc)(const char *, const char *,
+ int (*)(struct authinfo *, void *),
+ void *);
+ void (*auth_cleanupfunc)();
+ int (*auth_changepwd)(const char *, /* service */
+ const char *, /* userid */
+ const char *, /* oldpassword */
+ const char *); /* new password */
+
+ void (*auth_idle)();
+ /* Not null - gets called every 5 mins when we're idle */
+
+ void (*auth_enumerate)( void(*cb_func)(const char *name,
+ uid_t uid,
+ gid_t gid,
+ const char *homedir,
+ const char *maildir,
+ void *void_arg),
+ void *void_arg);
+ } ;
+</pre></div></div><br class="example-break" clear="none"/></blockquote></div><p>
+An authentication module is a shared library that defines a single function
+called
+“<span class="quote">courier_auth_<em class="replaceable"><code>NAME</code></em>_init</span>”, where
+“<span class="quote">NAME</span>” is the name of the authentication module.
+The shared library does not need to export any other symbols, this is the
+only function that needs to be exported.
+The function returns a pointer to the <span class="structname">authstaticinfo</span>
+structure.
+For example, the relevant code from the <code class="literal">authmysql</code> module is:
+</p><div class="blockquote"><blockquote class="blockquote"><div class="example"><a id="authmysqlex" shape="rect"> </a><p class="title"><b>Example 2. authmysql</b></p><div class="example-contents"><pre class="programlisting" xml:space="preserve">
+static struct authstaticinfo authmysql_info={
+ "authmysql",
+ auth_mysql,
+ auth_mysql_pre,
+ auth_mysql_cleanup,
+ auth_mysql_changepw,
+ auth_mysql_cleanup,
+ auth_mysql_enumerate};
+
+
+struct authstaticinfo *courier_authmysql_init()
+{
+ return &authmysql_info;
+}
+</pre></div></div><br class="example-break" clear="none"/></blockquote></div><p>
+<code class="function">auth_func</code> points to a function that handles an
+authentication request. The function is invoked as follows:</p><div class="blockquote"><blockquote class="blockquote"><div class="example"><a id="auth_func" shape="rect"> </a><p class="title"><b>Example 3. auth_func</b></p><div class="example-contents"><pre class="programlisting" xml:space="preserve">
+int result=auth_func(const char *service, const char *authtype,
+ const char *authdata,
+ int (*callback_func)(struct authinfo *, void *),
+ void *callback_arg);
+</pre></div></div><br class="example-break" clear="none"/></blockquote></div><p>
+“<span class="quote">service</span>” is the name of the service being authenticated,
+such as “<span class="quote"><code class="literal">imap</code></span>” or
+“<span class="quote"><code class="literal">pop3</code></span>”.
+“<span class="quote">authtype</span>” defines the authentication format,
+and “<span class="quote">authdata</span>” is the actual authentication request.</p><p>
+Two authentication formats are defined at this time.
+The “<span class="quote">authtype</span>” string is set to one of the following
+strings:</p><div class="variablelist"><dl><dt><span class="term">“<span class="quote">login</span>”</span></dt><dd><p>
+Tradition userid/password authentication.
+<code class="literal">authdata</code> points to a string that consists of:
+the userid; a newline character; the password; a final newline
+character.</p></dd><dt><span class="term">“<span class="quote">cram-md5</span>”, or “<span class="quote">cram-sha1</span>”</span></dt><dd><p>
+Challenge/response authentication.
+<code class="literal">authdata</code> points to a string that consists of:
+the base64-encoded challenge; a newline character;
+the base64-encoded response string; and a final newline
+character. Furthermore, the base64-encoded response string consists of:
+the login ID, a space character, and the response as a hexadecimal
+string (yes, base64-encoding of the response string is not strictly
+necessary).</p></dd></dl></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
+Not all authentication modules may implement all authentication formats.
+An authentication module that does not implement a particular authentication
+format should handle it the same way as an invalid login ID.</p></div><p>
+The authentication function should return a negative value if the login ID
+is invalid. The authentication library will try the next authentication
+module.</p><p>
+The authentication function should return a positive value if the login ID
+is valid, but the password is invalid. The authentication library will not
+try any more authentication modules.</p><p>
+Otherwise, the authentication module should call the
+<code class="function">callback_func</code> function, and return the same value that's
+returned by this function.</p><p>
+The authentication module should pass through <code class="literal">callback_arg</code>
+to the callback function as a second argument.
+The first argument is a pointer to the
+<span class="structname">authinfo</span> structure, which is described in detail
+in the
+<a href="auth_generic.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">auth_generic</span>(3)</span></a>
+manual page.
+The authentication module is responsible for allocating this structure.
+After the callback function returns this structure can be deallocated.
+The authentication module initializes the following fields:</p><p>
+<code class="function">auth_pre_func</code> points to a function that obtains
+account information. The function is invoked as follows:</p><div class="blockquote"><blockquote class="blockquote"><div class="example"><a id="auth_pre_func" shape="rect"> </a><p class="title"><b>Example 4. auth_pre_func</b></p><div class="example-contents"><pre class="programlisting" xml:space="preserve">
+int auth_pre_func(const char *user, const char *service,
+ int (*callback)(struct authinfo *, void *), void *arg);
+</pre></div></div><br class="example-break" clear="none"/></blockquote></div><p>
+This function does the same thing as “<span class="quote">auth_func</span>” except that
+the password is not actually verified.
+If the account exists, the callback function is invoked with the
+same callback arguments.</p><p>
+<code class="function">auth_cleanup_func</code> points to a function that will be
+invoked just before the authentication module is uninstalled, giving it
+the opportunity for some last-minute cleanup.</p><p>
+<code class="function">auth_idle</code> points to a function that will be
+invoked when no authentication requests are received for a couple of minutes,
+giving the authentication module an opportunity to close any database
+connections, so that they do not get shut down by the server, for inactivity,
+resulting in an error the next time an authentication request is
+received.</p><p>
+<code class="function">auth_changepwd</code> points to a function that will be
+invoked to change a password on an account, as follows.</p><div class="blockquote"><blockquote class="blockquote"><div class="example"><a id="auth_changepwd" shape="rect"> </a><p class="title"><b>Example 5. auth_changepwd</b></p><div class="example-contents"><pre class="programlisting" xml:space="preserve">
+int auth_changepwd(const char *service, const char *user,
+ const char *oldpw, const char *newpw);
+</pre></div></div><br class="example-break" clear="none"/></blockquote></div><p>
+<code class="literal">service</code> is the name of the service whose password is to
+be changed (such as “<span class="quote">imap</span>” or “<span class="quote">pop3</span>”).
+<code class="function">auth_changepwd</code> should return 0 if the password was
+changed succesfully, a negative value if <code class="literal">user</code> is invalid
+(the next authentication module will be tried), or a positive value if
+the password change request failed (no more modules will be tried).</p><p>
+<code class="function">auth_enumerate</code> points to a function that enumerates
+the list of all login IDs known to the authentication module.
+The first argument <code class="function">auth_enumerate</code> is a callback
+function. <code class="function">auth_enumerate</code> invokes the callback
+function once for each login ID, supplying the login ID, the userid,
+groupid, home directory and maildir as arguments.
+The last argument to the callback function is passed through from the
+second argument to <code class="function">auth_enumerate</code>.</p><p>
+After enumerating all login IDs <code class="function">auth_enumerate</code> calls
+the callback function one last time, with a NULL pointer for the login ID,
+then returns. If an error is encountered while enumerating the login IDs,
+<code class="function">auth_enumerate</code> terminates without invoking
+the callback function with a NULL login ID.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="files" shape="rect"> </a>FILES</h2></div></div></div><p>
+<code class="filename"> @authdaemonrc@</code> - <span><strong class="command">authdaemond</strong></span> configuration file</p><p>
+<code class="filename"> @authldaprc@</code> - <span><strong class="command">authldap</strong></span> configuration file</p><p>
+<code class="filename"> @authmysqlrc@</code> - <span><strong class="command">authmysql</strong></span> configuration file</p><p>
+<code class="filename"> @authpgsqlrc@</code> - <span><strong class="command">authpgsql</strong></span> configuration file</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="seealso" shape="rect"> </a>SEE ALSO</h2></div></div></div><p>
+<a href="courier.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">courier</span>(8)</span></a>,
+
+<a href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a></p></div></div></body></html>
--- /dev/null
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+
+# serial 48 AC_PROG_LIBTOOL
+
+
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If this macro is not defined by Autoconf, define it here.
+m4_ifdef([AC_PROVIDE_IFELSE],
+ [],
+ [m4_define([AC_PROVIDE_IFELSE],
+ [m4_ifdef([AC_PROVIDE_$1],
+ [$2], [$3])])])
+
+
+# AC_PROG_LIBTOOL
+# ---------------
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
+ AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [AC_LIBTOOL_CXX],
+ [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
+ ])])
+dnl And a similar setup for Fortran 77 support
+ AC_PROVIDE_IFELSE([AC_PROG_F77],
+ [AC_LIBTOOL_F77],
+ [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
+])])
+
+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
+ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [ifdef([AC_PROG_GCJ],
+ [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([A][M_PROG_GCJ],
+ [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([LT_AC_PROG_GCJ],
+ [define([LT_AC_PROG_GCJ],
+ defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
+])])# AC_PROG_LIBTOOL
+
+
+# _AC_PROG_LIBTOOL
+# ----------------
+AC_DEFUN([_AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])# _AC_PROG_LIBTOOL
+
+
+# AC_LIBTOOL_SETUP
+# ----------------
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+AC_LIBTOOL_SYS_MAX_CMD_LEN
+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+AC_LIBTOOL_OBJDIR
+
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+_LT_AC_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
+
+# Same as above, but do not quote variable references.
+[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+AC_CHECK_TOOL(AR, ar, false)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ AC_PATH_MAGIC
+ fi
+ ;;
+esac
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+AC_ARG_WITH([pic],
+ [AC_HELP_STRING([--with-pic],
+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+ [pic_mode="$withval"],
+ [pic_mode=default])
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+AC_LIBTOOL_LANG_C_CONFIG
+_LT_AC_TAGCONFIG
+])# AC_LIBTOOL_SETUP
+
+
+# _LT_AC_SYS_COMPILER
+# -------------------
+AC_DEFUN([_LT_AC_SYS_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_AC_SYS_COMPILER
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+AC_DEFUN([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+ case $cc_temp in
+ compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+ distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+AC_DEFUN([_LT_COMPILER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+AC_DEFUN([_LT_LINKER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+])# _LT_LINKER_BOILERPLATE
+
+
+# _LT_AC_SYS_LIBPATH_AIX
+# ----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
+[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_AC_SYS_LIBPATH_AIX
+
+
+# _LT_AC_SHELL_INIT(ARG)
+# ----------------------
+AC_DEFUN([_LT_AC_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_AC_SHELL_INIT
+
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[_LT_AC_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X[$]1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+[$]*
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+ echo_test_string=`eval $cmd` &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "[$]0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+])])# _LT_AC_PROG_ECHO_BACKSLASH
+
+
+# _LT_AC_LOCK
+# -----------
+AC_DEFUN([_LT_AC_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_LANG_PUSH(C)
+ AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+ AC_LANG_POP])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+sparc*-*solaris*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ *) LD="${LD-ld} -64" ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+ ;;
+ ])
+esac
+
+need_locks="$enable_libtool_lock"
+
+])# _LT_AC_LOCK
+
+
+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$3"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ fi
+ $rm conftest*
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$5], , :, [$5])
+else
+ ifelse([$6], , :, [$6])
+fi
+])# AC_LIBTOOL_COMPILER_OPTION
+
+
+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [ACTION-SUCCESS], [ACTION-FAILURE])
+# ------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
+[AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $3"
+ printf "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&AS_MESSAGE_LOG_FD
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ else
+ $2=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$4], , :, [$4])
+else
+ ifelse([$5], , :, [$5])
+fi
+])# AC_LIBTOOL_LINKER_OPTION
+
+
+# AC_LIBTOOL_SYS_MAX_CMD_LEN
+# --------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
+[# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+ i=0
+ teststring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on massive
+ # amounts of additional arguments before passing them to the linker.
+ # It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ ;;
+ esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+ AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+ AC_MSG_RESULT(none)
+fi
+])# AC_LIBTOOL_SYS_MAX_CMD_LEN
+
+
+# _LT_AC_CHECK_DLFCN
+# ------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)dnl
+])# _LT_AC_CHECK_DLFCN
+
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ---------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+ [$4]
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}]
+EOF
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) $1 ;;
+ x$lt_dlneed_uscore) $2 ;;
+ x$lt_dlunknown|x*) $3 ;;
+ esac
+ else :
+ # compilation failed
+ $3
+ fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+
+# AC_LIBTOOL_DLOPEN_SELF
+# ----------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ])
+ ;;
+
+ *)
+ AC_CHECK_FUNC([shl_load],
+ [lt_cv_dlopen="shl_load"],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
+ [AC_CHECK_FUNC([dlopen],
+ [lt_cv_dlopen="dlopen"],
+ [AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+ [AC_CHECK_LIB([dld], [dld_link],
+ [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ AC_CACHE_CHECK([whether a program can dlopen itself],
+ lt_cv_dlopen_self, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+ lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+ ])
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+ lt_cv_dlopen_self_static, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+ lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
+ ])
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+
+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
+# ---------------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler
+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+ fi
+ fi
+ chmod u+w . 2>&AS_MESSAGE_LOG_FD
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+])
+])# AC_LIBTOOL_PROG_CC_C_O
+
+
+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
+# -----------------------------------------
+# Check to see if we can do hard links to lock some files if needed
+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
+[AC_REQUIRE([_LT_AC_LOCK])dnl
+
+hard_links="nottested"
+if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ AC_MSG_CHECKING([if we can lock with hard links])
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ AC_MSG_RESULT([$hard_links])
+ if test "$hard_links" = no; then
+ AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
+
+
+# AC_LIBTOOL_OBJDIR
+# -----------------
+AC_DEFUN([AC_LIBTOOL_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+])# AC_LIBTOOL_OBJDIR
+
+
+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
+# ----------------------------------------------
+# Check hardcoding attributes.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_AC_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
+ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
+ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+ test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
+ # Linking always hardcodes the temporary library directory.
+ _LT_AC_TAGVAR(hardcode_action, $1)=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ _LT_AC_TAGVAR(hardcode_action, $1)=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
+
+
+# AC_LIBTOOL_SYS_LIB_STRIP
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
+[striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+fi
+ ;;
+ *)
+ AC_MSG_RESULT([no])
+ ;;
+ esac
+fi
+])# AC_LIBTOOL_SYS_LIB_STRIP
+
+
+# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
+[AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[[01]] | aix4.[[01]].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[[45]]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[[123]]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+&nb