Imported upstream version 0.59.3 upstream/0.59.3
authormwolson_admin <mwolson_admin@deleuze.hcoop.net>
Fri, 25 Jan 2008 21:56:37 +0000 (16:56 -0500)
committermwolson_admin <mwolson_admin@deleuze.hcoop.net>
Fri, 25 Jan 2008 21:56:37 +0000 (16:56 -0500)
341 files changed:
AUTHORS [new file with mode: 0644]
COPYING [new file with mode: 0644]
COPYING.GPL [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
INSTALL.html [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
NEWS [new file with mode: 0644]
NEWS.html [new file with mode: 0644]
README [new file with mode: 0644]
README.authdebug.html.in [new file with mode: 0644]
README.authmysql.html [new file with mode: 0644]
README.authmysql.myownquery [new file with mode: 0644]
README.authpostgres.html [new file with mode: 0644]
README.html [new file with mode: 0644]
README.ldap [new file with mode: 0644]
README_authlib.html.in [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
auth.h [new file with mode: 0644]
auth_enumerate.3 [new file with mode: 0644]
auth_enumerate.html [new file with mode: 0644]
auth_generic.3 [new file with mode: 0644]
auth_generic.html [new file with mode: 0644]
auth_getoption.3 [new file with mode: 0644]
auth_getoption.html [new file with mode: 0644]
auth_getuserinfo.3 [new file with mode: 0644]
auth_getuserinfo.html [new file with mode: 0644]
auth_login.3 [new file with mode: 0644]
auth_login.html [new file with mode: 0644]
auth_passwd.3 [new file with mode: 0644]
auth_passwd.html [new file with mode: 0644]
auth_sasl.3 [new file with mode: 0644]
auth_sasl.html [new file with mode: 0644]
authcustom.c [new file with mode: 0644]
authcustom.h [new file with mode: 0644]
authdaemon.c [new file with mode: 0644]
authdaemond.c [new file with mode: 0644]
authdaemond.in [new file with mode: 0644]
authdaemonlib.c [new file with mode: 0644]
authdaemonrc.in [new file with mode: 0644]
authdaemontest.c [new file with mode: 0644]
authenumerate.c [new file with mode: 0644]
authinfo.c [new file with mode: 0644]
authldap.c [new file with mode: 0644]
authldap.h [new file with mode: 0644]
authldap.schema [new file with mode: 0644]
authldaplib.c [new file with mode: 0644]
authldaprc [new file with mode: 0644]
authlib.3.in [new file with mode: 0644]
authlib.html.in [new file with mode: 0644]
authmigrate.in [new file with mode: 0644]
authmksock.c [new file with mode: 0644]
authmoduser2.c [new file with mode: 0644]
authmoduser3.c [new file with mode: 0644]
authmysql.c [new file with mode: 0644]
authmysql.h [new file with mode: 0644]
authmysqllib.c [new file with mode: 0644]
authmysqlrc [new file with mode: 0644]
authoption.c [new file with mode: 0644]
authpam.c [new file with mode: 0644]
authpasswd.1 [new file with mode: 0644]
authpasswd.c [new file with mode: 0644]
authpasswd.html [new file with mode: 0644]
authpgsql.c [new file with mode: 0644]
authpgsql.h [new file with mode: 0644]
authpgsqllib.c [new file with mode: 0644]
authpgsqlrc [new file with mode: 0644]
authpipe.c [new file with mode: 0644]
authpipelib.c [new file with mode: 0644]
authpipelib.h [new file with mode: 0644]
authpwd.c [new file with mode: 0644]
authpwdenumerate.c [new file with mode: 0644]
authsasl.c [new file with mode: 0644]
authsaslclient.c [new file with mode: 0644]
authsaslclient.h [new file with mode: 0644]
authsaslclientcram.c [new file with mode: 0644]
authsaslclientcrammd5.c [new file with mode: 0644]
authsaslclientcramsha1.c [new file with mode: 0644]
authsaslclientlogin.c [new file with mode: 0644]
authsaslclientplain.c [new file with mode: 0644]
authsaslcram.c [new file with mode: 0644]
authsaslfrombase64.c [new file with mode: 0644]
authsasllogin.c [new file with mode: 0644]
authsaslplain.c [new file with mode: 0644]
authsasltobase64.c [new file with mode: 0644]
authshadow.c [new file with mode: 0644]
authstaticlist.h [new file with mode: 0644]
authsyschangepwd.c [new file with mode: 0644]
authsyscommon.c [new file with mode: 0644]
authsystem.passwd.in [new file with mode: 0755]
authtest.1 [new file with mode: 0644]
authtest.c [new file with mode: 0644]
authtest.html [new file with mode: 0644]
authuserdb.c [new file with mode: 0644]
authuserdbpwd.c [new file with mode: 0644]
authvchkpw.c [new file with mode: 0644]
authvchkpwlib.c [new file with mode: 0644]
authwait.h [new file with mode: 0644]
automake.fix [new file with mode: 0644]
bdbobj/Makefile.am [new file with mode: 0644]
bdbobj/Makefile.in [new file with mode: 0644]
bdbobj/aclocal.m4 [new file with mode: 0644]
bdbobj/bdbobj.c [new file with mode: 0644]
bdbobj/bdbobj.h [new file with mode: 0644]
bdbobj/bdbobj2.c [new file with mode: 0644]
bdbobj/bdbobj3.c [new file with mode: 0644]
bdbobj/config.h.in [new file with mode: 0644]
bdbobj/configure [new file with mode: 0755]
bdbobj/configure.in [new file with mode: 0644]
bdbobj/testbdb.C [new file with mode: 0644]
bdbobj/testsuite [new file with mode: 0755]
bdbobj/testsuite.txt [new file with mode: 0644]
checkpassword.c [new file with mode: 0644]
checkpasswordmd5.c [new file with mode: 0644]
checkpasswordsha1.c [new file with mode: 0644]
config.guess [new file with mode: 0755]
config.sub [new file with mode: 0755]
configure [new file with mode: 0755]
configure.in [new file with mode: 0644]
courier-authlib.lpspec [new file with mode: 0644]
courier-authlib.lpspec.in [new file with mode: 0644]
courier-authlib.spec [new file with mode: 0644]
courier-authlib.spec.in [new file with mode: 0644]
courier-authlib.sysvinit.in [new file with mode: 0644]
courier_auth_config.h [new file with mode: 0644]
courier_auth_config.h.in [new file with mode: 0644]
courierauth.h [new file with mode: 0644]
courierauthdebug.h [new file with mode: 0644]
courierauthsasl.h [new file with mode: 0644]
courierauthsaslclient.h [new file with mode: 0644]
cramlib.c [new file with mode: 0644]
cramlib.h [new file with mode: 0644]
cryptpassword.c [new file with mode: 0644]
dbobj.h.in [new file with mode: 0644]
debug.c [new file with mode: 0644]
depcomp [new file with mode: 0755]
gdbmobj/Makefile.am [new file with mode: 0644]
gdbmobj/Makefile.in [new file with mode: 0644]
gdbmobj/aclocal.m4 [new file with mode: 0644]
gdbmobj/config.h.in [new file with mode: 0644]
gdbmobj/configure [new file with mode: 0755]
gdbmobj/configure.in [new file with mode: 0644]
gdbmobj/gdbmobj.c [new file with mode: 0644]
gdbmobj/gdbmobj.h [new file with mode: 0644]
gdbmobj/gdbmobj2.c [new file with mode: 0644]
gdbmobj/gdbmobj3.c [new file with mode: 0644]
gdbmobj/testgdbm.C [new file with mode: 0644]
gdbmobj/testsuite [new file with mode: 0755]
gdbmobj/testsuite.txt [new file with mode: 0644]
install-sh [new file with mode: 0755]
libhmac/Makefile.am [new file with mode: 0644]
libhmac/Makefile.in [new file with mode: 0644]
libhmac/aclocal.m4 [new file with mode: 0644]
libhmac/config.h.in [new file with mode: 0644]
libhmac/configure [new file with mode: 0755]
libhmac/configure.in [new file with mode: 0644]
libhmac/hmac.c [new file with mode: 0644]
libhmac/hmac.h [new file with mode: 0644]
libhmac/md5hmactest.c [new file with mode: 0644]
libhmac/md5hmactest.txt [new file with mode: 0644]
libhmac/sha1hmactest.c [new file with mode: 0644]
libhmac/sha1hmactest.txt [new file with mode: 0644]
liblock/Makefile.am [new file with mode: 0644]
liblock/Makefile.in [new file with mode: 0644]
liblock/aclocal.m4 [new file with mode: 0644]
liblock/config.h.in [new file with mode: 0644]
liblock/configure [new file with mode: 0755]
liblock/configure.in [new file with mode: 0644]
liblock/liblock.h [new file with mode: 0644]
liblock/lockdaemon.c [new file with mode: 0644]
liblock/lockfcntl.c [new file with mode: 0644]
liblock/lockflock.c [new file with mode: 0644]
liblock/locklockf.c [new file with mode: 0644]
liblock/lockmail.1 [new file with mode: 0644]
liblock/lockmail.c [new file with mode: 0644]
liblock/lockmail.html [new file with mode: 0644]
liblock/locktest.c [new file with mode: 0644]
liblock/mail.c [new file with mode: 0644]
liblock/mail.h [new file with mode: 0644]
liblog/Makefile.am [new file with mode: 0644]
liblog/Makefile.in [new file with mode: 0644]
liblog/aclocal.m4 [new file with mode: 0644]
liblog/config.h.in [new file with mode: 0644]
liblog/configure [new file with mode: 0755]
liblog/configure.in [new file with mode: 0644]
liblog/courierlogger.1 [new file with mode: 0644]
liblog/courierlogger.html [new file with mode: 0644]
liblog/logger.c [new file with mode: 0644]
libltdl/COPYING.LIB [new file with mode: 0644]
libltdl/Makefile.am [new file with mode: 0644]
libltdl/Makefile.in [new file with mode: 0644]
libltdl/README [new file with mode: 0644]
libltdl/acinclude.m4 [new file with mode: 0644]
libltdl/aclocal.m4 [new file with mode: 0644]
libltdl/config-h.in [new file with mode: 0644]
libltdl/config.guess [new file with mode: 0755]
libltdl/config.sub [new file with mode: 0755]
libltdl/configure [new file with mode: 0755]
libltdl/configure.ac [new file with mode: 0644]
libltdl/install-sh [new file with mode: 0755]
libltdl/ltdl.c [new file with mode: 0644]
libltdl/ltdl.h [new file with mode: 0644]
libltdl/ltmain.sh [new file with mode: 0644]
libltdl/missing [new file with mode: 0755]
ltmain.sh [new file with mode: 0644]
makedat/Makefile.am [new file with mode: 0644]
makedat/Makefile.in [new file with mode: 0644]
makedat/aclocal.m4 [new file with mode: 0644]
makedat/config.h.in [new file with mode: 0644]
makedat/configure [new file with mode: 0755]
makedat/configure.in [new file with mode: 0644]
makedat/makedat.in [new file with mode: 0755]
makedat/makedatprog.c [new file with mode: 0644]
md5/Makefile.am [new file with mode: 0644]
md5/Makefile.in [new file with mode: 0644]
md5/aclocal.m4 [new file with mode: 0644]
md5/config.h.in [new file with mode: 0644]
md5/configure [new file with mode: 0755]
md5/configure.in [new file with mode: 0644]
md5/hmac.c [new file with mode: 0644]
md5/md5.c [new file with mode: 0644]
md5/md5.h [new file with mode: 0644]
md5/md5_hash.c [new file with mode: 0644]
md5/md5test.c [new file with mode: 0644]
md5/md5test.txt [new file with mode: 0644]
md5/redhat-crypt-md5.c [new file with mode: 0644]
missing [new file with mode: 0755]
numlib/Makefile.am [new file with mode: 0644]
numlib/Makefile.in [new file with mode: 0644]
numlib/aclocal.m4 [new file with mode: 0644]
numlib/atotimet.c [new file with mode: 0644]
numlib/atouidt.c [new file with mode: 0644]
numlib/changeuidgid.c [new file with mode: 0644]
numlib/config.h.in [new file with mode: 0644]
numlib/configure [new file with mode: 0755]
numlib/configure.in [new file with mode: 0644]
numlib/numlib.h [new file with mode: 0644]
numlib/strdevt.c [new file with mode: 0644]
numlib/strgidt.c [new file with mode: 0644]
numlib/strhdevt.c [new file with mode: 0644]
numlib/strhinot.c [new file with mode: 0644]
numlib/strhpidt.c [new file with mode: 0644]
numlib/strhtimet.c [new file with mode: 0644]
numlib/strinot.c [new file with mode: 0644]
numlib/strofft.c [new file with mode: 0644]
numlib/strpidt.c [new file with mode: 0644]
numlib/strsize.c [new file with mode: 0644]
numlib/strsizet.c [new file with mode: 0644]
numlib/strtimet.c [new file with mode: 0644]
numlib/struidt.c [new file with mode: 0644]
pgpkeys.txt [new file with mode: 0644]
preauthcustom.c [new file with mode: 0644]
preauthdaemon.c [new file with mode: 0644]
preauthldap.c [new file with mode: 0644]
preauthmysql.c [new file with mode: 0644]
preauthpam.c [new file with mode: 0644]
preauthpgsql.c [new file with mode: 0644]
preauthpwd.c [new file with mode: 0644]
preauthshadow.c [new file with mode: 0644]
preauthuserdb.c [new file with mode: 0644]
preauthuserdbcommon.c [new file with mode: 0644]
preauthvchkpw.c [new file with mode: 0644]
prep.xsl [new file with mode: 0644]
random128/Makefile.am [new file with mode: 0644]
random128/Makefile.in [new file with mode: 0644]
random128/aclocal.m4 [new file with mode: 0644]
random128/config.h.in [new file with mode: 0644]
random128/configure [new file with mode: 0755]
random128/configure.in [new file with mode: 0644]
random128/random128.c [new file with mode: 0644]
random128/random128.h [new file with mode: 0644]
random128/random128alpha.c [new file with mode: 0644]
random128/random128binary.c [new file with mode: 0644]
rfc822/ChangeLog [new file with mode: 0644]
rfc822/Makefile.am [new file with mode: 0644]
rfc822/Makefile.in [new file with mode: 0644]
rfc822/aclocal.m4 [new file with mode: 0644]
rfc822/config.h.in [new file with mode: 0644]
rfc822/configure [new file with mode: 0755]
rfc822/configure.in [new file with mode: 0644]
rfc822/encode.c [new file with mode: 0644]
rfc822/encode.h [new file with mode: 0644]
rfc822/encodeautodetect.c [new file with mode: 0644]
rfc822/imaprefs.c [new file with mode: 0644]
rfc822/imaprefs.h [new file with mode: 0644]
rfc822/imapsubj.c [new file with mode: 0644]
rfc822/reftest.c [new file with mode: 0644]
rfc822/reftest.txt [new file with mode: 0644]
rfc822/rfc2047.c [new file with mode: 0644]
rfc822/rfc2047.h [new file with mode: 0644]
rfc822/rfc2047u.c [new file with mode: 0644]
rfc822/rfc822.3 [new file with mode: 0644]
rfc822/rfc822.c [new file with mode: 0644]
rfc822/rfc822.h [new file with mode: 0644]
rfc822/rfc822.html [new file with mode: 0644]
rfc822/rfc822_getaddr.c [new file with mode: 0644]
rfc822/rfc822_getaddrs.c [new file with mode: 0644]
rfc822/rfc822_mkdate.c [new file with mode: 0644]
rfc822/rfc822_parsedt.c [new file with mode: 0644]
rfc822/rfc822hdr.c [new file with mode: 0644]
rfc822/rfc822hdr.h [new file with mode: 0644]
rfc822/testsuite.c [new file with mode: 0644]
rfc822/testsuite.txt [new file with mode: 0755]
samplepipe.pl [new file with mode: 0644]
sha1/Makefile.am [new file with mode: 0644]
sha1/Makefile.in [new file with mode: 0644]
sha1/aclocal.m4 [new file with mode: 0644]
sha1/config.h.in [new file with mode: 0644]
sha1/configure [new file with mode: 0755]
sha1/configure.in [new file with mode: 0644]
sha1/hmac.c [new file with mode: 0644]
sha1/sha1.c [new file with mode: 0644]
sha1/sha1.h [new file with mode: 0644]
sha1/sha1_hash.c [new file with mode: 0644]
sha1/sha256.c [new file with mode: 0644]
sha1/sha256_hash.c [new file with mode: 0644]
sha1/testsuite.c [new file with mode: 0644]
sha1/testsuite.txt [new file with mode: 0644]
sysconftool [new file with mode: 0755]
userdb-test-cram-md5.pl.in [new file with mode: 0755]
userdb/Makefile.am [new file with mode: 0644]
userdb/Makefile.in [new file with mode: 0644]
userdb/aclocal.m4 [new file with mode: 0644]
userdb/configure [new file with mode: 0755]
userdb/configure.in [new file with mode: 0644]
userdb/makeuserdb.8.in [new file with mode: 0644]
userdb/makeuserdb.html.in [new file with mode: 0644]
userdb/makeuserdb.in [new file with mode: 0644]
userdb/pw2userdb.in [new file with mode: 0644]
userdb/userdb.8.in [new file with mode: 0644]
userdb/userdb.c [new file with mode: 0644]
userdb/userdb.h [new file with mode: 0644]
userdb/userdb.html.in [new file with mode: 0644]
userdb/userdb.pl.in [new file with mode: 0755]
userdb/userdb2.c [new file with mode: 0644]
userdb/userdbmkpw.c [new file with mode: 0644]
userdb/userdbpw.8.in [new file with mode: 0644]
userdb/userdbpw.c [new file with mode: 0644]
userdb/userdbpw.html.in [new file with mode: 0644]
userdb/vchkpw2userdb.in [new file with mode: 0755]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..a815c7e
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,17 @@
+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>
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..517e324
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,2 @@
+This software is released under the GPL, version 2 (see COPYING.GPL).
+
diff --git a/COPYING.GPL b/COPYING.GPL
new file mode 100644 (file)
index 0000000..d60c31a
--- /dev/null
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\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.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..64bf201
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,405 @@
+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.
+
+
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..08bfb85
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,354 @@
+                               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
diff --git a/INSTALL.html b/INSTALL.html
new file mode 100644 (file)
index 0000000..971992b
--- /dev/null
@@ -0,0 +1,403 @@
+<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>
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..fe51b79
--- /dev/null
@@ -0,0 +1,645 @@
+# $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
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..855cbf7
--- /dev/null
@@ -0,0 +1,1851 @@
+# 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:
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..31e321e
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,130 @@
+                         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).
diff --git a/NEWS.html b/NEWS.html
new file mode 100644 (file)
index 0000000..a36384b
--- /dev/null
+++ b/NEWS.html
@@ -0,0 +1,139 @@
+<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>
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..0a9b73f
--- /dev/null
+++ b/README
@@ -0,0 +1,71 @@
+                         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
diff --git a/README.authdebug.html.in b/README.authdebug.html.in
new file mode 100644 (file)
index 0000000..beac35a
--- /dev/null
@@ -0,0 +1,319 @@
+<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 &gt;filename
+2&gt;&amp;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=&lt;null&gt;, sysgroupid=1001, homedir=/home/brian, address=brian, fullname=Brian Candler, maildir=&lt;null&gt;, quota=&lt;null&gt;, options=&lt;null&gt;
+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>
diff --git a/README.authmysql.html b/README.authmysql.html
new file mode 100644 (file)
index 0000000..62b7792
--- /dev/null
@@ -0,0 +1,130 @@
+<?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>
diff --git a/README.authmysql.myownquery b/README.authmysql.myownquery
new file mode 100644 (file)
index 0000000..80ca722
--- /dev/null
@@ -0,0 +1,550 @@
+
+
+
+
+           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.
+
+---------------------------------------------------------------------------
+
diff --git a/README.authpostgres.html b/README.authpostgres.html
new file mode 100644 (file)
index 0000000..cbc0701
--- /dev/null
@@ -0,0 +1,31 @@
+<?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>
diff --git a/README.html b/README.html
new file mode 100644 (file)
index 0000000..62c8d23
--- /dev/null
@@ -0,0 +1,80 @@
+<?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>
diff --git a/README.ldap b/README.ldap
new file mode 100644 (file)
index 0000000..3acb0ff
--- /dev/null
@@ -0,0 +1,77 @@
+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.
+
diff --git a/README_authlib.html.in b/README_authlib.html.in
new file mode 100644 (file)
index 0000000..9661970
--- /dev/null
@@ -0,0 +1,721 @@
+<?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>&lt;newline&gt;</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">&lt;newline&gt;</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>&lt;newline&gt;</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">&lt;newline&gt;</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>&lt;tab&gt;</em></span>
+      <em class="replaceable"><code>username</code></em><span class="emphasis"><em>&lt;tab&gt;</em></span>
+      <em class="replaceable"><code>oldpasswd</code></em><span class="emphasis"><em>&lt;tab&gt;</em></span>
+      <em class="replaceable"><code>newpasswd</code></em><span class="emphasis"><em>&lt;tab&gt;</em></span>
+      <span class="emphasis"><em>&lt;newline&gt;</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">&lt;newline&gt;</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>&lt;newline&gt;</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 &amp;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>
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..683b6c3
--- /dev/null
@@ -0,0 +1,7300 @@
+# 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