From bb7325e28112929a325a04a844266101b2c5eac5 Mon Sep 17 00:00:00 2001 From: Joey Schulze Date: Wed, 14 May 2008 08:46:20 +0000 Subject: [PATCH 1/1] Import of upstream source 4.3.9 --- 500mod_auth_mysql.info | 43 + DIRECTIVES | 261 +++ INSTALL | 10 + Makefile.in | 29 + USAGE | 125 ++ auth_mysql.load | 1 + config.h.in | 49 + configure | 4588 ++++++++++++++++++++++++++++++++++++++++ configure.ac | 180 ++ install-sh | 5 + mod_auth_mysql.c | 1749 +++++++++++++++ 11 files changed, 7040 insertions(+) create mode 100644 500mod_auth_mysql.info create mode 100644 DIRECTIVES create mode 100644 INSTALL create mode 100644 Makefile.in create mode 100644 USAGE create mode 100644 auth_mysql.load create mode 100644 config.h.in create mode 100755 configure create mode 100644 configure.ac create mode 100755 install-sh create mode 100644 mod_auth_mysql.c diff --git a/500mod_auth_mysql.info b/500mod_auth_mysql.info new file mode 100644 index 0000000..d1074dc --- /dev/null +++ b/500mod_auth_mysql.info @@ -0,0 +1,43 @@ +LoadModule: auth_mysql_module /usr/lib/apache/1.3/mod_auth_mysql.so +Directives: + Auth_MySQL_Info + AuthMySQL_DefaultHost + AuthMySQL_Host + AuthMySQL_DefaultUser + AuthMySQL_User + AuthMySQL_DefaultPassword + AuthMySQL_Password + Auth_MySQL_General_DB + Auth_MySQL_DB + AuthMySQL_DefaultDB + AuthMySQL_DB + Auth_MySQL_Username + Auth_MySQL_Password + Auth_MySQL_DB + Auth_MySQL_Password_Table + AuthMySQL_Password_Table + Auth_MySQL_Group_Table + Auth_MySQL_Password_Field + Auth_MySQL_Username_Field + Auth_MySQL_Group_Field + AuthMySQL_Group_Table + AuthMySQL_Password_Field + AuthMySQL_Username_Field + AuthMySQL_Group_Field + AuthMySQL_Group_User_Field + Auth_MySQL_Empty_Passwords + AuthMySQL_Empty_Passwords + Auth_MySQL_Authoritative + AuthMySQL_Authoritative + Auth_MySQL_Encrypted_Passwords + AuthMySQL_Encrypted_Passwords + Auth_MySQL_Scrambled_Passwords + AuthMySQL_Scrambled_Passwords + Auth_MySQL_Encryption_Types + AuthMySQL_Encryption_Types + Auth_MySQL_Non_Persistent + AuthMySQL_Persistent + AuthMySQL_AllowOverride + Auth_MySQL + AuthMySQL +Description: Support for MySQL authentication diff --git a/DIRECTIVES b/DIRECTIVES new file mode 100644 index 0000000..6a48da2 --- /dev/null +++ b/DIRECTIVES @@ -0,0 +1,261 @@ +All the directives understood by this version of mod-auth-mysql are listed +below. The huge number of synonym directives is due to the merging of two +separate versions of the program, both of which had subtly different usage +symantics. I'm sure there will be rationalisation in the near future. + +Auth_MySQL_Info + Server-wide config option to specify the database host, username, + and password used to connect to the MySQL server. + + This option affects all directories which do not override it via + AuthMySQL_Host, AuthMySQL_User, and/or AuthMySQL_Password. + +AuthMySQL_DefaultHost + Specifies the MySQL server to use for authentication. + + This option affects all directories which do not override it via + AuthMySQL_Host. + +AuthMySQL_Host + Synonym for AuthMySQL_DefaultHost, to be used in .htaccess files and + directory-specific entries. + +Auth_MySQL_DefaultPort + Specifies a port to use to talk to a MySQL server. If left empty, + the default (3306) will be used. + + This option affects all directories which do not override it via + Auth_MySQL_Port. + +Auth_MySQL_Port + Specifies a non-default port to use (other than 3306) when talking + to the MySQL server on AuthMySQL_Host or AuthMySQL_DefaultHost. + +Auth_MySQL_DefaultSocket + If using a local MySQL server, you can + specify a non-default named pipe to use instead of the default pipe + name compiled into your MySQL client library. + + This option affects all directories which do not override it via + Auth_MySQL_Socket. + +Auth_MySQL_Socket + If using a local MySQL server, you can specify a non-default named + pipe to use instead of the default one compiled into MySQL with this + option. + +AuthMySQL_DefaultUser + Specifies the username for connection to the MySQL server. + +AuthMySQL_User + Synonym for AuthMySQL_DefaultUser, to be used in .htaccess files and + directory-specific entries. + +AuthMySQL_DefaultPassword + Specifies the password user together with the above user. + +AuthMySQL_Password + Synonym for AuthMySQL_Password, to be used in .htaccess files and + directory-specific entries. + +Auth_MySQL_General_DB + Server-wide, specifies a default database name to use. + +Auth_MySQL_DB + Synonym for Auth_MySQL_General_DB, to be used in .htaccess files and + directory-specific entries. + +AuthMySQL_DefaultDB + Synonym for Auth_MySQL_General_DB. + +AuthMySQL_DB + Synonym for Auth_MySQL_General_DB, to be used in .htaccess files and + directory-specific entries. + +AuthName "" + Describes the data you're guarding. + +AuthType + The authentication process used in the transaction. Stick with + Basic, no others work at present. + +require + Specify what is considered a valid authentication. can be + either user, group, or valid-user. valid-user is the simplest - + anyone who gets the username and password right gets in. Otherwise, + the user must either have a username in the space-separated list of + identifiers (if using user) or must be a member of a group in the + list of identifiers (if user group). + + Multiple require statements are allowed; if multiple require + statements are present in a configuration, then the user will be + considered authenticated if they can satisfy any of the require + statements supplied. + +Auth_MySQL_Password_Table + The name of the MySQL table in the specified database which stores + username:password pairs. By default, it is 'mysql_auth'. + +AuthMySQL_Password_Table + Synonym for Auth_MySQL_Password_Table. + +Auth_MySQL_Group_Table + As per ...Password_Table above, stores username:group pairs. + Normally you'll store username:password:group triplets in the one + table, but we are nothing if not flexible. Defaults to + 'mysql_auth'. + +AuthMySQL_Group_Table + Synonym for Auth_MySQL_Group_Table. + +Auth_MySQL_Username_Field + The name of the field which stores usernames. Defaults to + 'username'. The username/password combo specified in Auth_MySQL_Info + must have select privileges to this field in the Password and Group + tables. + +AuthMySQL_Username_Field + Synonym for Auth_MySQL_Username_Field. + +Auth_MySQL_Password_Field + As per ...Username_Field above, but for passwords. Same MySQL + access privileges. Defaults to 'password'. + +AuthMySQL_Password_Field + Synonym for Auth_MySQL_Password_Field. + +Auth_MySQL_Group_Field + As per ...Username_Field above. Defaults to 'groups'. + +AuthMySQL_Group_Field + Synonym for Auth_MySQL_Group_Field. + +Auth_MySQL_Group_User_Field + The name of the field in the groups table which stores the username. + Defaults to the field name specified for usernames in the passwords + table. + +AuthMySQL_Group_User_Field + Synonym for Auth_MySQL_Group_User_Field. + +Auth_MySQL_Password_Clause + Adds arbitrary clause to username:password matching query, for example: + " AND Allowed=1". Clause has to start with space. Default is empty. + +Auth_MySQL_Group_Clause + Adds arbitrary clause to username:group matching query, for example: + " AND Allowed=1". Clause has to start with space. Default is empty. + +Auth_MySQL_Empty_Passwords + Whether or not to allow empty passwords. If the password field is + empty (equals to '') and this option is 'on', users would be able to + access the page by just specifying their username WITHOUT ANY + PASSWORD CHECKING. If this is 'off', they would be denied access. + Default: 'on'. + +AuthMySQL_Empty_Passwords + Synonym for Auth_MySQL_Empty_Passwords. + +Auth_MySQL_Encryption_Types + + Select which types of encryption to check, and in which order to + check them. It overrides the legacy Auth_MySQL_Scrambled_Passwords + and Auth_MySQL_Encrypted_Passwords directives. Multiple encryption + types may be specified, to instruct the module to check each + password in multiple encryption schemes - a useful feature for + legacy transitions. For example: + + Auth_MySQL_Encryption_Types Plaintext Crypt_DES + + Would instruct the module to do a direct comparison of the entered + password with the contents of the password field, and if that fails, + to do a DES crypt() check, a la Unix password handling. + + The available encryption types supported at this time are: + + Plaintext + Pretty self-explanatory. Not recommended. + + Crypt_DES + Check the password via the standard Unix crypt() call, using + DES hashing. + + Crypt_MD5 + Check the password via the standard Unix crypt() call, using + an MD5 hash. + + Crypt + Check the password via the standard Unix crypt() call, + without preference for the hashing scheme employed. This is + the generally preferred means of checking crypt()ed + passwords, because it allows you to use other schemes which + may be available on your system, such as blowfish. + + PHP_MD5 + Compares with an MD5 hash, encoded in the way that PHP and + MySQL handle MD5 hashes - 32 character hex code, with + lowercase letters. + + SHA1Sum + Compares with a SHA1 hash, encoded the way that MySQL, PHP, + and the sha1sum command produce their output (a 40 character + lowercase hex representation). + + MySQL + The hashing scheme used by the MySQL PASSWORD() function. + +AuthMySQL_Encryption_Types + Synonym for Auth_MySQL_Encryption_Types. + +Auth_MySQL_Encrypted_Passwords (DEPRECATED) + Equivalent to: Auth_MySQL_Encryption_Types Crypt_DES + Only used if ...Encryption_Types is not set. Defaults to 'on'. If + both this option and ...Scrambled_Passwords are 'off' and + ...Encryption_Types is not set, passwords are expected to be in + plaintext. + +AuthMySQL_Encrypted_Passwords (DEPRECATED) + Synonym for Auth_MySQL_Encrypted_Passwords. + +Auth_MySQL_Scrambled_Passwords (DEPRECATED) + Equivalent to: Auth_MySQL_Encryption_Types MySQL + The same restrictions apply to this directive as to + ...Encrypted_Passwords. + +AuthMySQL_Scrambled_Passwords (DEPRECATED) + Synonym for Auth_MySQL_Scrambled_Passwords. + +Auth_MySQL_Authoritative + Whether or not to use other authentication schemes if the user is + successfully authenticated. That is, if the user passes the MySQL + authentication, they may still be rejected by a later module if this + option is set 'off'. The default is 'on' (i.e. if the user passes + the MySQL module, they're considered OK). + +AuthMySQL_Authoritative + Synonym for Auth_MySQL_Authoritative. + +Auth_MySQL_Non_Persistent + If set to 'on', the link to the MySQL server is explicitly closed + after each authentication request. Note that I can't think of any + possible good reason to do this, unless your platform makes MySQL go + crazy when it has plenty of simultaneous threads (bad handling of + file descriptors may cause that). In my opinion, one should + increase the maximum number of simultaneous threads in MySQL and + keep this option off. Default: off, and for good reason. + +AuthMySQL_Persistent + An antonym for Auth_MySQL_Non_Persistent. + +AuthMySQL_AllowOverride + Whether or not .htaccess files are allowed to use their own + Host/User/Password/DB specifications. If set to 'off', then the + defaults specified in the httpd.conf cannot be overridden. + +Auth_MYSQL + Whether or not to enable MySQL authentication. If it's off, the + MySQL authentication will simply pass authentication off to other + modules defined. + +AuthMySQL + Synonym for Auth_MYSQL. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..989fcbb --- /dev/null +++ b/INSTALL @@ -0,0 +1,10 @@ +You'll need to have the development libraries and include files for both +MySQL and Apache. Both should be found automatically if they're installed +somewhere reasonable, but otherwise, specify the location using the +--with-mysql-includes, --with-mysql-libs, and --with-apxs options to +configure (see ./configure --help for more information). + +Once configure has run successfully, you should be able to type 'make && +make install' for a happy installation. + +See USAGE for information on how exactly to use this beast. diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..7540dbd --- /dev/null +++ b/Makefile.in @@ -0,0 +1,29 @@ +APXS = @apxs@ +APXSFLAGS = +APXS2 = @apxs2@ +APXS2FLAGS = +SRCS = mod_auth_mysql.c +HDRS = config.h +OPTS = @build_opts@ -lmysqlclient +MODULES = @modules@ + +all: $(MODULES) + +apache13_mod_auth_mysql.so: $(SRCS) $(HDRS) + $(APXS) $(APXSFLAGS) -o $@ $(OPTS) -c $(SRCS) + +apache2_mod_auth_mysql.so: apache2_mod_auth_mysql.la + cp .libs/apache2_mod_auth_mysql.so . + +apache2_mod_auth_mysql.la: $(SRCS) $(HDRS) + $(APXS2) $(APXS2FLAGS) -o $@ $(OPTS) -DAPACHE2 -c $(SRCS) + +clean: + -rm -rf *.o *.so *.lo *.slo *.la .libs + +distclean: clean + -rm -f config.status config.log config.h Makefile + -rm -rf autom4te.cache + +maintclean: distclean + -rm -f configure diff --git a/USAGE b/USAGE new file mode 100644 index 0000000..d83db0a --- /dev/null +++ b/USAGE @@ -0,0 +1,125 @@ +OK, so it's compiled cleanly and now it's time to use it. You've come to +the right place. + +Creating the necessary SQL information +-------------------------------------- + +At the very least, you need a table in your database which has a list of +usernames and their corresponding passwords. Having a field listing the +group users belong to, or a separate table for that, is useful too, but you +need usernames and passwords as a minimum. + +For instance: + +create table mysql_auth ( + username char(25) not null, + passwd char(25), + groups char(25), + primary key (username) +); + +This would work quite well. + +NOTE 1: You don't have to use a new table for the purpose of storing +usernames and passwords; I quite happily use a 'members' table (with all +sorts of other interesting information in it) with mod-auth-mysql. + +NOTE 2: The names given above are merely the defaults for the module. They +can all be overridden if you have different names for your fields (eg +password instead of passwd). + +Once your table(s) is/are created, you need to put the data in as +appropriate. + + +Telling Apache to protect the website +------------------------------------- + +First up, tell the module where it should be getting it's info from: + +Auth_MySQL_Info + +or + +AuthMySQL_DefaultHost +AuthMySQL_DefaultUser +AuthMySQL_DefaultPassword + +This should be placed globally. + +If you're going to use the same database all over your web server, you can +use + +Auth_MySQL_General_DB + +to set that. This setting can be overridden in .htaccess files if +AuthMySQL_AllowOverride is set. + +On that topic, if you want .htaccess files to be restricted in what they're +able to connect to database-wise, you can + +AuthMySQL_AllowOverride no + +and the host, user, password, and database name cannot be changed. + +Create a .htaccess file in the directory you want to protect (or put the +directives inside a Directory section in httpd.conf) with something like the +following: + +AuthName "My Company's Financial Information - Top Secret" +AuthType Basic +require valid-user + +This will allow any user who can supply a username and password access. + +If you replace the require line with + +require user bill fred jane + +then only users who can successfully authenticate as bill, fred, or jane +will be allowed access. Or, if you set the require line to + +require group executives + +then only users who are a part of the executives group will be allowed +access to the documents in that directory. + +A special note: multiple require lines are logically OR'd -- if the user's +details match *any* of the require lines supplied, the user will be +considered authenticated. For example, + +require user jane joe +require group executives + +means that if the user is jane or joe, or the user is in the executives +group, they will be let in. Neither jane nor joe have to be in the +executives group. + +Passwords +----------- + +There is also the slight matter of how the passwords are stored in the +database. Several different methods are available: + +Plaintext +Crypt_DES +Crypt_MD5 +Crypt (basically Crypt_DES and Crypt_MD5, plus any other schemes your local + crypt() call implements) +PHP_MD5 (MD5 hashes, encoded the way PHP and MySQL both do it) +SHA1Sum (SHA1 hashes, encoded as a 40 character lowercase hex string) +MySQL (the hashing scheme used by the MySQL PASSWORD() function) + +You should list all of the available ways your passwords can be encoded in +the Auth_MySQL_Encryption_Types config item. By default, only Crypt_DES is +enabled. A common example, if you're using a PHP script to manage +passwords, might be: + +Auth_MySQL_Encryption_Types PHP_MD5 Crypt + +Note that adding more types to be checked slows down authentication, and +allowing the Plaintext type means that any hashed passwords stored in the DB +become plaintext equivalents. + +The full set of directives available are now listed in the file DIRECTIVES, +for ease of perusal. diff --git a/auth_mysql.load b/auth_mysql.load new file mode 100644 index 0000000..be80731 --- /dev/null +++ b/auth_mysql.load @@ -0,0 +1 @@ +LoadModule auth_mysql_module /usr/lib/apache2/modules/mod_auth_mysql.so diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..f6b821e --- /dev/null +++ b/config.h.in @@ -0,0 +1,49 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Enable DES encrpytion */ +#undef CRYPT_DES + +/* Enable crypt() MD5 encryption */ +#undef CRYPT_MD5 + +/* Define to 1 if you have the header file. */ +#undef HAVE_CRYPT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `mysqlclient' library (-lmysqlclient). */ +#undef HAVE_LIBMYSQLCLIENT + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define as the return type of signal handlers (`int' or `void'). */ +#undef RETSIGTYPE + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const diff --git a/configure b/configure new file mode 100755 index 0000000..390b02f --- /dev/null +++ b/configure @@ -0,0 +1,4588 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59 for mod_auth_mysql 4.2.0. +# +# Copyright (C) 2003 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME='mod_auth_mysql' +PACKAGE_TARNAME='mod_auth_mysql' +PACKAGE_VERSION='4.2.0' +PACKAGE_STRING='mod_auth_mysql 4.2.0' +PACKAGE_BUGREPORT='' + +ac_unique_file="mod_auth_mysql.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT modules apxs apxs2 mysql_includes mysql_libs build_opts CPP EGREP LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures mod_auth_mysql 4.2.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of mod_auth_mysql 4.2.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-apache13 Indicate that the apache 1.3 module should be built + --enable-apache2 Indicate that the apache 2.0 module should be built + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-apxs location of the apxs module helper + --with-apxs2 location of the apxs2 Apache2 module helper + --with-mysql-includes MySQL includes directory + --with-mysql-libs MySQL libraries directory + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd "$ac_popdir" + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF +mod_auth_mysql configure 4.2.0 +generated by GNU Autoconf 2.59 + +Copyright (C) 2003 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by mod_auth_mysql $as_me 4.2.0, which was +generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ac_config_headers="$ac_config_headers config.h" + + +# Checks for programs. + +# Checks for libraries. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +echo "$as_me:$LINENO: checking for mysql_init in -lmysqlclient" >&5 +echo $ECHO_N "checking for mysql_init in -lmysqlclient... $ECHO_C" >&6 +if test "${ac_cv_lib_mysqlclient_mysql_init+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmysqlclient $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char mysql_init (); +int +main () +{ +mysql_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_mysqlclient_mysql_init=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_mysqlclient_mysql_init=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_mysqlclient_mysql_init" >&5 +echo "${ECHO_T}$ac_cv_lib_mysqlclient_mysql_init" >&6 +if test $ac_cv_lib_mysqlclient_mysql_init = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBMYSQLCLIENT 1 +_ACEOF + + LIBS="-lmysqlclient $LIBS" + +fi + + +# Check whether --enable-apache13 or --disable-apache13 was given. +if test "${enable_apache13+set}" = set; then + enableval="$enable_apache13" + +if test "x$enableval" = "xyes"; then + buildapache13="yes" + modules="$modules apache13_mod_auth_mysql.so" +fi + +else + +# Build the apache 1.3 module by default +buildapache13="yes" +modules="$modules apache13_mod_auth_mysql.so" + +fi; + +# Check whether --enable-apache2 or --disable-apache2 was given. +if test "${enable_apache2+set}" = set; then + enableval="$enable_apache2" + +if test "x$enableval" = "xyes"; then + buildapache2="yes" + modules="$modules apache2_mod_auth_mysql.so" +fi + +fi; + + + +# Check whether --with-apxs or --without-apxs was given. +if test "${with_apxs+set}" = set; then + withval="$with_apxs" + +if test "x$buildapache13" = "xyes"; then + if test ! -x $withval; then + { { echo "$as_me:$LINENO: error: $withval not found" >&5 +echo "$as_me: error: $withval not found" >&2;} + { (exit 1); exit 1; }; } + else + apxs="$withval" + fi +fi + +else + +if test "x$buildapache13" = "xyes"; then + # Test common apxs locations; add any others I've missed here + if test -x /usr/bin/apxs; then + apxs="/usr/bin/apxs" + elif test -x /usr/local/bin/apxs; then + apxs="/usr/local/bin/apxs" + else + { { echo "$as_me:$LINENO: error: Apache extension helper apxs not found!" >&5 +echo "$as_me: error: Apache extension helper apxs not found!" >&2;} + { (exit 1); exit 1; }; } + fi +fi + +fi; + + + +# Check whether --with-apxs2 or --without-apxs2 was given. +if test "${with_apxs2+set}" = set; then + withval="$with_apxs2" + +if test "x$buildapache2" = "xyes"; then + if test ! -x $withval; then + { { echo "$as_me:$LINENO: error: $withval not found" >&5 +echo "$as_me: error: $withval not found" >&2;} + { (exit 1); exit 1; }; } + else + apxs2="$withval" + fi +fi + +else + +if test "x$buildapache2" = "xyes"; then + # Test likely apxs2 locations + if test -x /usr/bin/apxs2; then + apxs2="/usr/bin/apxs2" + elif test -x /usr/local/bin/apxs2; then + apxs2="/usr/local/bin/apxs2" + else + { { echo "$as_me:$LINENO: error: Apache2 extension helper not found!" >&5 +echo "$as_me: error: Apache2 extension helper not found!" >&2;} + { (exit 1); exit 1; }; } + fi +fi + +fi; + + + +# Check whether --with-mysql-includes or --without-mysql-includes was given. +if test "${with_mysql_includes+set}" = set; then + withval="$with_mysql_includes" + +if test ! -e $withval/mysql.h; then + { { echo "$as_me:$LINENO: error: Invalid MySQL includes directory: $withval" >&5 +echo "$as_me: error: Invalid MySQL includes directory: $withval" >&2;} + { (exit 1); exit 1; }; } +else + mysql_includes="-I$withval" +fi + +else + +# Common location finder +if test -e /usr/include/mysql/mysql.h; then + mysql_includes="-I/usr/include/mysql" +elif test -e /usr/include/mysql.h; then + mysql_includes="-I/usr/include" +elif test -e /usr/local/include/mysql/mysql.h; then + mysql_includes="-I/usr/local/include/mysql" +elif test -e /usr/local/include/mysql.h; then + mysql_includes="-I/usr/local/include" +else + { { echo "$as_me:$LINENO: error: MySQL include files not found!" >&5 +echo "$as_me: error: MySQL include files not found!" >&2;} + { (exit 1); exit 1; }; } +fi + +fi; + + + +# Check whether --with-mysql-libs or --without-mysql-libs was given. +if test "${with_mysql_libs+set}" = set; then + withval="$with_mysql_libs" + +if test ! -e $withval/libmysqlclient.so; then + { { echo "$as_me:$LINENO: error: Invalid MySQL libs directory: $withval" >&5 +echo "$as_me: error: Invalid MySQL libs directory: $withval" >&2;} + { (exit 1); exit 1; }; } +else + mysql_libs="-L$withval" +fi + +else + +# Common location finder +if test -e /usr/lib/mysql/libmysqlclient.so; then + mysql_libs="-L/usr/lib/mysql" +elif test -e /usr/lib/libmysqlclient.so; then + mysql_libs="-L/usr/lib" +elif test -e /usr/local/lib/mysql/libmysqlclient.so; then + mysql_libs="-L/usr/local/lib/mysql" +elif test -e /usr/local/lib/libmysqlclient.so ; then + mysql_libs="-L/usr/local/lib" +else + { { echo "$as_me:$LINENO: error: MySQL libraries not found!" >&5 +echo "$as_me: error: MySQL libraries not found!" >&2;} + { (exit 1); exit 1; }; } +fi + +fi; + + +build_opts="$mysql_includes $mysql_libs" + + +# Checks for header files. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in crypt.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ----------------------------------------- ## +## Report this to the mod_auth_mysql lists. ## +## ----------------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +echo "$as_me:$LINENO: checking for crypt in -lcrypt" >&5 +echo $ECHO_N "checking for crypt in -lcrypt... $ECHO_C" >&6 +if test "${ac_cv_lib_crypt_crypt+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcrypt $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char crypt (); +int +main () +{ +crypt (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_crypt_crypt=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_crypt_crypt=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_crypt_crypt" >&5 +echo "${ECHO_T}$ac_cv_lib_crypt_crypt" >&6 +if test $ac_cv_lib_crypt_crypt = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBCRYPT 1 +_ACEOF + + LIBS="-lcrypt $LIBS" + +fi + + +if test -n $HAVE_CRYPT_H; then + if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run test program while cross compiling +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +int main() +{ + return strcmp(crypt("a", "\$1\$aaaaaaaa"), + "\$1\$aaaaaaaa\$S270EsVIz5M8Y9/k4SSEf."); +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define CRYPT_MD5 1 +_ACEOF + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run test program while cross compiling +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +int main() +{ + return strcmp(crypt("a", "aa"), + "aafKPWZb/dLAs"); +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define CRYPT_DES 1 +_ACEOF + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + +fi # if test -n HAVE_CRYPT_H + +# Checks for typedefs, structures, and compiler characteristics. +echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + } +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_const=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + + +# Checks for library functions. +echo "$as_me:$LINENO: checking return type of signal handlers" >&5 +echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6 +if test "${ac_cv_type_signal+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#ifdef signal +# undef signal +#endif +#ifdef __cplusplus +extern "C" void (*signal (int, void (*)(int)))(int); +#else +void (*signal ()) (); +#endif + +int +main () +{ +int i; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_signal=void +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_signal=int +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 +echo "${ECHO_T}$ac_cv_type_signal" >&6 + +cat >>confdefs.h <<_ACEOF +#define RETSIGTYPE $ac_cv_type_signal +_ACEOF + + + + ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by mod_auth_mysql $as_me 4.2.0, which was +generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +mod_auth_mysql config.status 4.2.0 +configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2003 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@modules@,$modules,;t t +s,@apxs@,$apxs,;t t +s,@apxs2@,$apxs2,;t t +s,@mysql_includes@,$mysql_includes,;t t +s,@mysql_libs@,$mysql_libs,;t t +s,@build_opts@,$build_opts,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + # Do quote $f, to prevent DOS paths from being IFS'd. + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +_ACEOF + +# Transform confdefs.h into two sed scripts, `conftest.defines' and +# `conftest.undefs', that substitutes the proper values into +# config.h.in to produce config.h. The first handles `#define' +# templates, and the second `#undef' templates. +# And first: Protect against being on the right side of a sed subst in +# config.status. Protect against being in an unquoted here document +# in config.status. +rm -f conftest.defines conftest.undefs +# Using a here document instead of a string reduces the quoting nightmare. +# Putting comments in sed scripts is not portable. +# +# `end' is used to avoid that the second main sed command (meant for +# 0-ary CPP macros) applies to n-ary macro definitions. +# See the Autoconf documentation for `clear'. +cat >confdef2sed.sed <<\_ACEOF +s/[\\&,]/\\&/g +s,[\\$`],\\&,g +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +t end +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +: end +_ACEOF +# If some macros were called several times there might be several times +# the same #defines, which is useless. Nevertheless, we may not want to +# sort them, since we want the *last* AC-DEFINE to be honored. +uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines +sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs +rm -f confdef2sed.sed + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >>conftest.undefs <<\_ACEOF +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +_ACEOF + +# Break up conftest.defines because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS +echo ' :' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.defines >/dev/null +do + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/defines.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines +echo ' fi # grep' >>$CONFIG_STATUS +echo >>$CONFIG_STATUS + +# Break up conftest.undefs because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #undef templates' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.undefs >/dev/null +do + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/undefs.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail + rm -f conftest.undefs + mv conftest.tail conftest.undefs +done +rm -f conftest.undefs + +cat >>$CONFIG_STATUS <<\_ACEOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..02c2116 --- /dev/null +++ b/configure.ac @@ -0,0 +1,180 @@ +# Process this file with autoconf to produce a configure script. +AC_INIT(mod_auth_mysql, 4.2.0) + +AC_CONFIG_SRCDIR([mod_auth_mysql.c]) +AC_CONFIG_HEADER([config.h]) + +# Checks for programs. + +# Checks for libraries. +AC_CHECK_LIB([mysqlclient], [mysql_init]) + +AC_ARG_ENABLE(apache13, +AC_HELP_STRING([--enable-apache13], [Indicate that the apache 1.3 module should be built]), +[ +if test "x$enableval" = "xyes"; then + buildapache13="yes" + modules="$modules apache13_mod_auth_mysql.so" +fi +], +[ +# Build the apache 1.3 module by default +buildapache13="yes" +modules="$modules apache13_mod_auth_mysql.so" +]) + +AC_ARG_ENABLE(apache2, +AC_HELP_STRING([--enable-apache2], [Indicate that the apache 2.0 module should be built]), +[ +if test "x$enableval" = "xyes"; then + buildapache2="yes" + modules="$modules apache2_mod_auth_mysql.so" +fi +]) +AC_SUBST(modules) + +AC_ARG_WITH(apxs, +AC_HELP_STRING([--with-apxs], [location of the apxs module helper]), +[ +if test "x$buildapache13" = "xyes"; then + if test ! -x $withval; then + AC_MSG_ERROR($withval not found) + else + apxs="$withval" + fi +fi +], +[ +if test "x$buildapache13" = "xyes"; then + # Test common apxs locations; add any others I've missed here + if test -x /usr/bin/apxs; then + apxs="/usr/bin/apxs" + elif test -x /usr/local/bin/apxs; then + apxs="/usr/local/bin/apxs" + else + AC_MSG_ERROR(Apache extension helper apxs not found!) + fi +fi +]) +AC_SUBST(apxs) + +AC_ARG_WITH(apxs2, +AC_HELP_STRING([--with-apxs2], [location of the apxs2 Apache2 module helper]), +[ +if test "x$buildapache2" = "xyes"; then + if test ! -x $withval; then + AC_MSG_ERROR($withval not found) + else + apxs2="$withval" + fi +fi +], +[ +if test "x$buildapache2" = "xyes"; then + # Test likely apxs2 locations + if test -x /usr/bin/apxs2; then + apxs2="/usr/bin/apxs2" + elif test -x /usr/local/bin/apxs2; then + apxs2="/usr/local/bin/apxs2" + else + AC_MSG_ERROR(Apache2 extension helper not found!) + fi +fi +]) +AC_SUBST(apxs2) + +AC_ARG_WITH(mysql-includes, +AC_HELP_STRING([--with-mysql-includes], [MySQL includes directory]), +[ +if test ! -e $withval/mysql.h; then + AC_MSG_ERROR(Invalid MySQL includes directory: $withval) +else + mysql_includes="-I$withval" +fi +], +[ +# Common location finder +if test -e /usr/include/mysql/mysql.h; then + mysql_includes="-I/usr/include/mysql" +elif test -e /usr/include/mysql.h; then + mysql_includes="-I/usr/include" +elif test -e /usr/local/include/mysql/mysql.h; then + mysql_includes="-I/usr/local/include/mysql" +elif test -e /usr/local/include/mysql.h; then + mysql_includes="-I/usr/local/include" +else + AC_MSG_ERROR(MySQL include files not found!) +fi +]) +AC_SUBST(mysql_includes) + +AC_ARG_WITH(mysql-libs, +AC_HELP_STRING([--with-mysql-libs], [MySQL libraries directory]), +[ +if test ! -e $withval/libmysqlclient.so; then + AC_MSG_ERROR(Invalid MySQL libs directory: $withval) +else + mysql_libs="-L$withval" +fi +], +[ +# Common location finder +if test -e /usr/lib/mysql/libmysqlclient.so; then + mysql_libs="-L/usr/lib/mysql" +elif test -e /usr/lib/libmysqlclient.so; then + mysql_libs="-L/usr/lib" +elif test -e /usr/local/lib/mysql/libmysqlclient.so; then + mysql_libs="-L/usr/local/lib/mysql" +elif test -e /usr/local/lib/libmysqlclient.so ; then + mysql_libs="-L/usr/local/lib" +else + AC_MSG_ERROR(MySQL libraries not found!) +fi +]) +AC_SUBST(mysql_libs) + +AC_SUBST(build_opts, "$mysql_includes $mysql_libs") + +# Checks for header files. +AC_CHECK_HEADERS([crypt.h]) + +AC_CHECK_LIB([crypt], [crypt]) + +if test -n $HAVE_CRYPT_H; then + AC_TRY_RUN( +[ +#include +#include + +int main() +{ + return strcmp(crypt("a", "\$1\$aaaaaaaa"), + "\$1\$aaaaaaaa\$S270EsVIz5M8Y9/k4SSEf."); +} +], +AC_DEFINE(CRYPT_MD5, 1, [Enable crypt() MD5 encryption]), +,,) + AC_TRY_RUN( +[ +#include +#include + +int main() +{ + return strcmp(crypt("a", "aa"), + "aafKPWZb/dLAs"); +} +], +AC_DEFINE(CRYPT_DES, 1, [Enable DES encrpytion]), +,,) + +fi # if test -n HAVE_CRYPT_H + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST + +# Checks for library functions. +AC_TYPE_SIGNAL + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..a5f0afc --- /dev/null +++ b/install-sh @@ -0,0 +1,5 @@ +#!/bin/sh + +# Dummy file to make configure happy. + +exit 0 diff --git a/mod_auth_mysql.c b/mod_auth_mysql.c new file mode 100644 index 0000000..ee1f94b --- /dev/null +++ b/mod_auth_mysql.c @@ -0,0 +1,1749 @@ +/* + * Copyright (c) 2001 by J. R. Westmoreland + * Portions Copyright (c) 2002-2004 by Matthew Palmer + * + * Original module/version: mod_auth_mysql v2.20 + * Originally written and maintained by Zeev Suraski + * A couple of fixes by Marschall Peter + * and Brent Metz + * MySQL/PHP style MD5 hashes, and an integration with the mod-auth-mysql + * maintained by Bill Joned by Matthew Palmer + * + * This version maintained by Matthew Palmer + * + * Please read the INSTALL and USAGE files for further information. + * + * 2004-02-01 MURAKAMI, takeshi + * add port, socket + * 2004-02-07 MURAKAMI, takeshi + * apache2 + * 2004-09-20 Joseph Walton + * SHA1 hash support + */ + +#define AUTH_MYSQL_VERSION "4.3.9" + +#include "config.h" + +#ifdef APACHE2 +#define PALLOC apr_palloc +#define PCALLOC apr_pcalloc +#define SNPRINTF apr_snprintf +#define PSTRDUP apr_pstrdup +#define PSTRCAT apr_pstrcat +#define APACHELOG(severity, handle, message...) ap_log_error(APLOG_MARK, APLOG_NOERRNO | severity, 0, handle->server, message) +#else +#define PALLOC ap_palloc +#define PCALLOC ap_pcalloc +#define SNPRINTF ap_snprintf +#define PSTRDUP ap_pstrdup +#define PSTRCAT ap_pstrcat +#define APACHELOG(severity, handle, message...) ap_log_error(APLOG_MARK, APLOG_NOERRNO | severity, handle->server, message) +#endif + +#include +#include +#include +#include +#include +#ifdef APACHE2 +#include "http_request.h" /* for ap_hook_(check_user_id | auth_checker)*/ +#include +#include +#else +#include +#include +#endif + +#include +#include +#include + +#ifdef HAVE_CRYPT_H +#include +#endif + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +/* This are the system-wide config options; the more specific options live in + * a mysql_auth_config_rec structure, one for each MySQL-configured directory. + */ +static char *auth_db_host = NULL, + *auth_db_name = NULL, + *auth_db_user = NULL, + *auth_db_pwd = NULL; + +static int auth_db_override = 1; + +char *tmp_host = NULL; +char *auth_db_socket = NULL; +long auth_db_port = -1; +unsigned long auth_db_client_flag = 0; + +/* Support for general-purpose encryption schemes. Should be fairly straightforward. + * We have a checking routine and a name for it (for AuthMySQL_Encryption_Types). + */ + +#define PLAINTEXT_ENCRYPTION_FLAG 1<<0 +#ifdef CRYPT_DES +#define CRYPT_DES_ENCRYPTION_FLAG 1<<1 +#endif +#define MYSQL_ENCRYPTION_FLAG 1<<2 +#ifdef CRYPT_MD5 +#define CRYPT_MD5_ENCRYPTION_FLAG 1<<3 +#endif +#define PHP_MD5_ENCRYPTION_FLAG 1<<4 +#ifdef HAVE_CRYPT_H +#define CRYPT_ENCRYPTION_FLAG 1<<5 +#endif +#define SHA1SUM_ENCRYPTION_FLAG 1<<6 + +static int check_no_encryption(const char *passwd, char *enc_passwd) +{ + return (!strcmp(passwd, enc_passwd)); +} + + +#ifdef CRYPT_DES +static int check_crypt_des_encryption(const char *passwd, char *enc_passwd) +{ + /* Ensure that MD5 passwords aren't checked here */ + if (!strncmp(enc_passwd, "$1$", 3)) { + return 0; + } + return (!strcmp(crypt(passwd, enc_passwd), enc_passwd)); +} +#endif + +#ifdef CRYPT_MD5 +static int check_crypt_MD5_encryption(const char *passwd, char *enc_passwd) +{ + /* Make sure only MD5 passwords are checked */ + if (strncmp(enc_passwd, "$1$", 3)) { + return 0; + } + return (!strcmp(crypt(passwd, enc_passwd), enc_passwd)); +} +#endif + +#ifdef HAVE_CRYPT_H +static int check_crypt_encryption(const char *passwd, char *enc_passwd) +{ + return (!strcmp(crypt(passwd, enc_passwd), enc_passwd)); +} +#endif + +char hex_digit(char c) +{ + if (c < 10) { + return c+'0'; + } else { + return c-10+'a'; + } +} + +static char *md5_hex_hash(const char *pass) +{ + unsigned char hash[16]; + /* This makes this function *very* specialised. Change this to + * use dynamic memory if you want to reuse it somewhere else */ + static char real_hash[33]; + int i; +#ifdef APACHE2 + apr_md5_ctx_t ct; + + apr_md5_init(&ct); + apr_md5_update(&ct, pass, strlen(pass)); + apr_md5_final(hash, &ct); +#else + AP_MD5_CTX ct; + + ap_MD5Init(&ct); + ap_MD5Update(&ct, pass, strlen(pass)); + ap_MD5Final(hash, &ct); +#endif + + /* Now we convert the 16 octet hash to a 32 byte hex string */ + for (i = 0; i < 16; i++) { + real_hash[2*i+1] = hash[i] & 0xF; + real_hash[2*i] = (hash[i] & 0xF0) >> 4; + } + for (i = 0; i < 32; i++) { + real_hash[i] = hex_digit(real_hash[i]); + } + real_hash[32] = '\0'; + + return real_hash; +} + +static int check_PHP_MD5_encryption(const char *passwd, char *enc_passwd) +{ + return (!strcmp(md5_hex_hash(passwd), enc_passwd)); +} + +static char *sha1_hex_hash(const char *passwd) +{ + int i; + +#ifdef APACHE2 + apr_sha1_ctx_t ct; + char hash[APR_SHA1_DIGESTSIZE]; + static char real_hash[APR_SHA1_DIGESTSIZE * 2 + 1]; + + apr_sha1_init(&ct); + apr_sha1_update(&ct, passwd, strlen(passwd)); + apr_sha1_final(hash, &ct); +#else + AP_SHA1_CTX ct; + char hash[SHA_DIGESTSIZE]; + static char real_hash[SHA_DIGESTSIZE * 2 + 1]; + + ap_SHA1Init(&ct); + ap_SHA1Update(&ct, passwd, strlen(passwd)); + ap_SHA1Final(hash, &ct); +#endif + + /* Now we convert the 20 octet hash to a 40 byte hex string */ + for (i = 0; i < sizeof(hash); i++) { + real_hash[2*i+1] = hash[i] & 0xF; + real_hash[2*i] = (hash[i] & 0xF0) >> 4; + } + for (i = 0; i < sizeof(real_hash); i++) { + real_hash[i] = hex_digit(real_hash[i]); + } + real_hash[sizeof(real_hash)-1] = '\0'; + + return real_hash; +} + +static int check_SHA1Sum_encryption(const char *passwd, char *enc_passwd) +{ + return (!strcmp(sha1_hex_hash(passwd), enc_passwd)); +} + + +static int check_mysql_encryption(const char *passwd, char *enc_passwd) +{ + char scrambled_passwd[32]; + + make_scrambled_password(scrambled_passwd, passwd); + return (!strcmp(scrambled_passwd, enc_passwd)); +} + +typedef struct { + char *name; + int (*check_function)(const char *passwd, char *enc_passwd); + int flag; +} encryption_type_entry; + +encryption_type_entry supported_encryption_types[] = { + { "Plaintext", check_no_encryption, PLAINTEXT_ENCRYPTION_FLAG }, +#if CRYPT_DES + { "Crypt_DES", check_crypt_des_encryption, CRYPT_DES_ENCRYPTION_FLAG }, +#endif + { "MySQL", check_mysql_encryption, MYSQL_ENCRYPTION_FLAG }, +#if CRYPT_MD5 + { "Crypt_MD5", check_crypt_MD5_encryption, CRYPT_MD5_ENCRYPTION_FLAG }, +#endif + { "Crypt", check_crypt_encryption, CRYPT_ENCRYPTION_FLAG }, + { "PHP_MD5", check_PHP_MD5_encryption, PHP_MD5_ENCRYPTION_FLAG }, + { "SHA1Sum", check_SHA1Sum_encryption, SHA1SUM_ENCRYPTION_FLAG}, + /* add additional encryption types below */ + { NULL, NULL, 0 } +}; + +static int get_encryption_flag(const char *name) +{ + register encryption_type_entry *ete=supported_encryption_types; + + while (ete->name) { + if (!strcmp(ete->name, name)) { + return ete->flag; + } + ete++; + } + return 0; +} + +/* end of support for general-purpose encryption schemes */ + +/* Per-directory configuration structure. One of these is created for each + * ... and .htaccess file which requests authentication + */ +typedef struct { + char *dir; + + char *db_host; + char *db_socket; + unsigned int db_port; + char *db_user; + char *db_pwd; + char *db_name; + + MYSQL *dbh; + + /* Boolean options */ + unsigned char persistent; + unsigned char enable_mysql_auth; + + /* Some MySQL errors are retryable; if we retry the operation + * by recursing into the same function, we set this so we don't + * recurse indefinitely if it's a permanent error. + */ + unsigned char dbh_error_lastchance; + + char *user_table; + char *group_table; + + char *user_field; + char *password_field; + char *group_field; + char *group_user_field; + char *group_where_clause; + char *password_where_clause; + + int encryption_types; + unsigned char using_encryption_types; + + unsigned char allow_empty_passwords; + unsigned char authoritative; + + /* You're not going to believe this, but, near as I can tell, apache + * doesn't respect the last part of the config_rec. May be an + * underflow in some code somewhere, but I'm not taking no chances + * with *my* config variables... + */ + char sacrificial_lamb[15]; + +} mysql_auth_config_rec; + +module auth_mysql_module; + +#ifdef APACHE2 +static apr_status_t +#else +static void +#endif +auth_mysql_cleanup(void *ptr) +{ + mysql_auth_config_rec *sec = ptr; + + if (sec->dbh) { +#ifdef DEBUG + syslog(LOG_DEBUG, "MAMDEBUG: Closing MySQL connection"); +#endif + mysql_close(sec->dbh); + sec->dbh = NULL; + } +} + +/* Do the magic required when the module is first loaded. + */ +#ifdef APACHE2 +void mysql_auth_init_handler(server_rec *s, apr_pool_t *p) +#else +void mysql_auth_init_handler(server_rec *s, pool *p) +#endif +{ +#ifdef APACHE2 +#else +#if MODULE_MAGIC_NUMBER >= 19980527 + ap_add_version_component("AuthMySQL/" AUTH_MYSQL_VERSION); +#endif +#endif +} + +/* Called each and every time a new per-directory configuration is + * created. We just initialise variables and set defaults. This is + * run *before* actual config takes place. + */ +#ifdef APACHE2 +void *create_mysql_auth_dir_config(apr_pool_t *p, char *d) +#else +void *create_mysql_auth_dir_config(pool *p, char *d) +#endif +{ +#ifdef DEBUG + int i; +#endif + + mysql_auth_config_rec *sec = (mysql_auth_config_rec *) PCALLOC(p, sizeof(mysql_auth_config_rec)); + +#ifdef DEBUG + syslog(LOG_DEBUG, "MAMDEBUG: Now configuring server config for %s", d); + syslog(LOG_DEBUG, "MAMDEBUG: sizeof(mysql_auth_config_rec) = %i", + sizeof(mysql_auth_config_rec)); +#endif + + sec->db_name = sec->db_socket = sec->db_user = sec->db_pwd = NULL; + + sec->dbh = NULL; + /* When the memory for this connection record is cleaned, we must + * be sure to close the DB connection, if it exists. If this does + * not happen, we are in a world of pain. + */ +#ifdef APACHE2 + apr_pool_cleanup_register(p, sec, auth_mysql_cleanup, apr_pool_cleanup_null); +#else + ap_register_cleanup(p, sec, auth_mysql_cleanup, ap_null_cleanup); +#endif + + sec->dir = d; + + sec->user_table = sec->group_table = NULL; + sec->user_field = sec->password_field = sec->group_field = NULL; + sec->group_where_clause = sec->password_where_clause = NULL; + sec->group_user_field = NULL; + + sec->authoritative = 1; + sec->allow_empty_passwords = 1; + + sec->dbh_error_lastchance = 0; + +#ifdef DEBUG + syslog(LOG_DEBUG, "MAMDEBUG: Enabling MySQL auth by default"); +#endif + sec->enable_mysql_auth = 1; + +#ifdef CRYPT_DES + sec->encryption_types = CRYPT_DES_ENCRYPTION_FLAG; + sec->using_encryption_types = 0; +#else + sec->encryption_types = 0; + sec->using_encryption_types = 0; +#endif + + sec->db_port = -1; + +#ifdef DEBUG + syslog(LOG_DEBUG, "MAMDEBUG: Persistent is now ON"); +#endif + sec->persistent = 1; + +#ifdef DEBUG + for (i = 0; i < 15; i++) + { + sec->sacrificial_lamb[i] = i % 10 + '0'; + } +#endif + + return sec; +} + +/* Helper function to make some decisions about whether to use crypted + * passwords in response to "AuthMySQL_Encrypted_Passwords on" in a config + * file. + * XXX DEPRECATED XXX + */ +static const char *set_crypted_password_flag(cmd_parms *cmd, void *sconf, int arg) +{ + mysql_auth_config_rec *sec = (mysql_auth_config_rec *) sconf; + + if (sec->using_encryption_types) { + /* This setting is ignored if we're using Encryption_Types */ + return NULL; + } +#ifdef CRYPT_DES + if (arg) { + sec->encryption_types |= CRYPT_DES_ENCRYPTION_FLAG; + } else { + sec->encryption_types &= ~CRYPT_DES_ENCRYPTION_FLAG; + if (!sec->encryption_types) { + sec->encryption_types = PLAINTEXT_ENCRYPTION_FLAG; + } + } +#endif + + return NULL; +} + +/* Equivalent to set_crypted_password_flag above, except that this time we're + * talking about MySQL-style scrambled passwords instead. + * XXX DEPRECATED XXX + */ +static const char *set_scrambled_password_flag(cmd_parms *cmd, void *sconf, int arg) +{ + mysql_auth_config_rec *sec = (mysql_auth_config_rec *) sconf; + + if (sec->using_encryption_types) { + /* This setting is ignored if we're using Encryption_Types */ + return NULL; + } + if (arg) { + sec->encryption_types |= MYSQL_ENCRYPTION_FLAG; + } else { + sec->encryption_types &= ~MYSQL_ENCRYPTION_FLAG; + if (!sec->encryption_types) { + sec->encryption_types = PLAINTEXT_ENCRYPTION_FLAG; + } + } + return NULL; +} + +/* Ensure that any string passed through us won't unduly upset the MySQL + * server when passed in as part of a query. + */ +#ifdef APACHE2 +static char *mysql_escape(char *str, apr_pool_t *p) +#else +static char *mysql_escape(char *str, pool *p) +#endif +{ + char *dest; + + if (!str) { + return NULL; + } + + dest = (char *) PALLOC(p, strlen(str) * 2 + 1); + if (!dest) { + return str; + } + + mysql_escape_string(dest, str, strlen(str)); + + return dest; +} + +/* Config helper to set the server-wide default database name. + */ +static const char *set_auth_mysql_db(cmd_parms * parms, void *dummy, const char *db) +{ + auth_db_name = (char *)db; + return NULL; +} + +/* Config helper to set the server-wide default database host. + */ +static const char *set_auth_mysql_host(cmd_parms *parms, void *dummy, const char *host) +{ + auth_db_host = (char *) host; + return NULL; +} + +/* Config helper to set server-wide defaults for database parameters. + */ +static const char *set_auth_mysql_info(cmd_parms * parms, void *dummy, const char *host, const char *user, const char *pwd) +{ + if (*host != '.') { + auth_db_host = (char *) host; + } + + if (*user != '.') { + auth_db_user = (char *)user; + } + + if (*pwd != '.') { + auth_db_pwd = (char *)pwd; + } + + return NULL; +} + +/* Config helper to set the server-wide default database username. + */ +static const char *set_auth_mysql_user(cmd_parms *parms, void *dummy, const char *user) +{ + auth_db_user = (char *)user; + return NULL; +} + +/* Config helper to set the server-wide default database password (coupled to + * the user specified above). + */ +static const char *set_auth_mysql_pwd(cmd_parms *parms, void *dummy, const char *pwd) +{ + auth_db_pwd = (char *)pwd; + return NULL; +} + +/* Set the server-wide database server socket. + */ +static const char *set_auth_mysql_socket(cmd_parms *parms, void *dummy, const char *sock) +{ + auth_db_socket = (char *)socket; + return NULL; +} + +/* Set the server-wide database server port. + */ +static const char *set_auth_mysql_port(cmd_parms *parms, void *dummy, const char *port) +{ + auth_db_port = (unsigned int) atoi(port); + return NULL; +} + +/* Config helper to judge whether to allow per-directory configs to override + * the server-wide defaults for database parameters. The only reason this + * exists (instead of using an ap_set_flag_slot) is because this isn't part + * of a config structure, and I'm not sure how to set globals from the Apache + * config thing. + */ +static const char *set_auth_mysql_override(cmd_parms *parms, void *dummy, int arg) +{ + auth_db_override = arg; + return NULL; +} + +/* Config helper to set a selected encryption type. + */ +static const char *set_encryption_types(cmd_parms *cmd, void *sconf, const char *arg) +{ + mysql_auth_config_rec *sec = (mysql_auth_config_rec *) sconf; + + int new_encryption_flag = get_encryption_flag(arg); + + if (!new_encryption_flag) { + APACHELOG(APLOG_ERR, cmd, "Unsupported encryption type: %s", arg); + return NULL; + } + + if (!sec->using_encryption_types) { + sec->encryption_types = 0; + sec->using_encryption_types = 1; + } + + sec->encryption_types |= new_encryption_flag; + + return NULL; +} + +/* This pair of config helpers exist only because of varying semantics + * in the two versions of mod_auth_mysql I merged. As soon as we have a + * consistent set of configuration primitives, these are going. + */ +static const char *set_non_persistent(cmd_parms *cmd, void *sconf, int arg) +{ + mysql_auth_config_rec *sec = (mysql_auth_config_rec *) sconf; + + sec->persistent = !arg; + APACHELOG(APLOG_DEBUG, cmd, "set_non_persistent: Setting persistent in %s to %i", sec->dir, sec->persistent); + return NULL; +} + +static const char *set_persistent(cmd_parms *cmd, void *sconf, int arg) +{ + mysql_auth_config_rec *sec = (mysql_auth_config_rec *) sconf; + + sec->persistent = arg; + APACHELOG(APLOG_DEBUG, cmd, "set_persistent: Setting persistent in %s to %i", sec->dir, sec->persistent); + return NULL; +} + +static const char *enable_mysql(cmd_parms *cmd, void *sconf, int arg) +{ + mysql_auth_config_rec *sec = (mysql_auth_config_rec *) sconf; + + sec->enable_mysql_auth = arg; + APACHELOG(APLOG_DEBUG, cmd, "enable_mysql: Setting enable_mysql_auth in %s to %i", sec->dir, sec->enable_mysql_auth); + return NULL; +} + +/* The command list. What it's called, when it's legal to use it, and + * what to do when we find it. Pretty cool, IMHO. + */ + +#ifdef APACHE2 +static +command_rec mysql_auth_cmds[] = { + AP_INIT_TAKE3( "Auth_MySQL_Info", set_auth_mysql_info, + NULL, + RSRC_CONF, "host, user and password of the MySQL database" ), + + AP_INIT_TAKE1( "AuthMySQL_DefaultHost", set_auth_mysql_host, + NULL, + RSRC_CONF, "Default MySQL host" ), + + AP_INIT_TAKE1( "AuthMySQL_DefaultUser", set_auth_mysql_user, + NULL, + RSRC_CONF, "Default MySQL user" ), + + AP_INIT_TAKE1( "AuthMySQL_DefaultPassword", set_auth_mysql_pwd, + NULL, + RSRC_CONF, "Default MySQL password" ), + + AP_INIT_TAKE1( "Auth_MySQL_DefaultPort", set_auth_mysql_port, + NULL, + RSRC_CONF, "Default MySQL server port" ), + + AP_INIT_TAKE1( "Auth_MySQL_DefaultSocket", set_auth_mysql_socket, + NULL, + RSRC_CONF, "Default MySQL server socket" ), + + AP_INIT_TAKE1( "Auth_MySQL_General_DB", set_auth_mysql_db, + NULL, + RSRC_CONF, "default database for MySQL authentication" ), + + AP_INIT_TAKE1( "AuthMySQL_DefaultDB", set_auth_mysql_db, + NULL, + RSRC_CONF, "default database for MySQL authentication" ), + + AP_INIT_TAKE1( "AuthMySQL_Host", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_host), + OR_AUTHCFG, "database host" ), + + AP_INIT_TAKE1( "Auth_MySQL_Host", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_host), + OR_AUTHCFG, "database host" ), + + AP_INIT_TAKE1( "Auth_MySQL_Socket", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_socket), + OR_AUTHCFG, "database host socket" ), + + AP_INIT_TAKE1( "AuthMySQL_Socket", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_socket), + OR_AUTHCFG, "database host socket" ), + + AP_INIT_TAKE1( "Auth_MySQL_Port", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_port), + OR_AUTHCFG, "database host port" ), + + AP_INIT_TAKE1( "AuthMySQL_Port", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_port), + OR_AUTHCFG, "database host port" ), + + AP_INIT_TAKE1( "Auth_MySQL_Username", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_user), + OR_AUTHCFG, "database user" ), + + AP_INIT_TAKE1( "AuthMySQL_User", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_user), + OR_AUTHCFG, "database user" ), + + AP_INIT_TAKE1( "Auth_MySQL_Password", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_pwd), + OR_AUTHCFG, "database password" ), + + AP_INIT_TAKE1( "AuthMySQL_Password", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_pwd), + OR_AUTHCFG, "database password" ), + + AP_INIT_TAKE1( "Auth_MySQL_DB", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_name), + OR_AUTHCFG, "database name" ), + + AP_INIT_TAKE1( "AuthMySQL_DB", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, db_name), + OR_AUTHCFG, "database name" ), + + AP_INIT_TAKE1( "Auth_MySQL_Password_Table", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, user_table), + OR_AUTHCFG, "Name of the MySQL table containing the password/user-name combination" ), + + AP_INIT_TAKE1( "AuthMySQL_Password_Table", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, user_table), + OR_AUTHCFG, "Name of the MySQL table containing the password/user-name combination" ), + + AP_INIT_TAKE1( "Auth_MySQL_Group_Table", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, group_table), + OR_AUTHCFG, "Name of the MySQL table containing the group-name/user-name combination; can be the same as the password-table." ), + + AP_INIT_TAKE1( "Auth_MySQL_Group_Clause", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, group_where_clause), + OR_AUTHCFG, "Additional WHERE clause for group/user-name lookup" ), + + AP_INIT_TAKE1( "AuthMySQL_Group_Table", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, group_table), + OR_AUTHCFG, "Name of the MySQL table containing the group-name/user-name combination; can be the same as the password-table." ), + + AP_INIT_TAKE1( "Auth_MySQL_Password_Field", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, password_field), + OR_AUTHCFG, "The name of the field in the MySQL password table" ), + + AP_INIT_TAKE1( "AuthMySQL_Password_Field", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, password_field), + OR_AUTHCFG, "The name of the field in the MySQL password table" ), + + AP_INIT_TAKE1( "Auth_MySQL_Password_Clause", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, password_where_clause), + OR_AUTHCFG, "Additional WHERE clause for group password/user-name lookup" ), + + AP_INIT_TAKE1( "Auth_MySQL_Username_Field", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, user_field), + OR_AUTHCFG, "The name of the user-name field in the MySQL password (and possibly group) table(s)." ), + + AP_INIT_TAKE1( "AuthMySQL_Username_Field", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, user_field), + OR_AUTHCFG, "The name of the user-name field in the MySQL password (and possibly group) table(s)." ), + + AP_INIT_TAKE1( "Auth_MySQL_Group_Field", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, group_field), + OR_AUTHCFG, "The name of the group field in the MySQL group table; must be set if you want to use groups." ), + + AP_INIT_TAKE1( "AuthMySQL_Group_Field", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, group_field), + OR_AUTHCFG, "The name of the group field in the MySQL group table; must be set if you want to use groups." ), + + AP_INIT_TAKE1( "Auth_MySQL_Group_User_Field", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, group_user_field), + OR_AUTHCFG, "The name of the user-name field in the MySQL group table; defaults to the same as the username field for the password table." ), + + AP_INIT_TAKE1( "AuthMySQL_Group_User_Field", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, group_user_field), + OR_AUTHCFG, "The name of the user-name field in the MySQL group table; defaults to the same as the username field for the password table." ), + + AP_INIT_FLAG( "Auth_MySQL_Empty_Passwords", ap_set_flag_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, allow_empty_passwords), + OR_AUTHCFG, "Enable (on) or disable (off) empty password strings; in which case any user password is accepted." ), + + AP_INIT_FLAG( "AuthMySQL_Empty_Passwords", ap_set_flag_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, allow_empty_passwords), + OR_AUTHCFG, "Enable (on) or disable (off) empty password strings; in which case any user password is accepted." ), + + AP_INIT_FLAG( "Auth_MySQL_Authoritative", ap_set_flag_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, authoritative), + OR_AUTHCFG, "When 'on' the MySQL database is taken to be authoritative and access control is not passed along to other db or access modules." ), + + AP_INIT_FLAG( "AuthMySQL_Authoritative", ap_set_flag_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, authoritative), + OR_AUTHCFG, "When 'on' the MySQL database is taken to be authoritative and access control is not passed along to other db or access modules." ), + + AP_INIT_FLAG( "AuthMySQL_AllowOverride", set_auth_mysql_override, + NULL, + RSRC_CONF, "Allow directory overrides of configuration" ), + + AP_INIT_FLAG( "Auth_MySQL_Encrypted_Passwords", set_crypted_password_flag, + NULL, + OR_AUTHCFG, "When 'on' the password in the password table are taken to be crypt()ed using your machines crypt() function." ), + + AP_INIT_FLAG( "AuthMySQL_Encrypted_Passwords", set_crypted_password_flag, + NULL, + OR_AUTHCFG, "When 'on' the password in the password table are taken to be crypt()ed using your machines crypt() function." ), + + AP_INIT_FLAG( "Auth_MySQL_Scrambled_Passwords", set_scrambled_password_flag, + NULL, + OR_AUTHCFG, "When 'on' the password in the password table are taken to be scramble()d using mySQL's password() function." ), + + AP_INIT_FLAG( "AuthMySQL_Scrambled_Passwords", set_scrambled_password_flag, + NULL, + OR_AUTHCFG, "When 'on' the password in the password table are taken to be scramble()d using mySQL's password() function." ), + + AP_INIT_ITERATE( "Auth_MySQL_Encryption_Types", set_encryption_types, + NULL, + OR_AUTHCFG, "Encryption types to use" ), + + AP_INIT_ITERATE( "AuthMySQL_Encryption_Types", set_encryption_types, + NULL, + OR_AUTHCFG, "Encryption types to use" ), + + AP_INIT_FLAG( "Auth_MySQL_Non_Persistent", set_non_persistent, + NULL, + OR_AUTHCFG, "Use non-persistent MySQL links" ), + + AP_INIT_FLAG( "AuthMySQL_Persistent", set_persistent, + NULL, + OR_AUTHCFG, "Use non-persistent MySQL links" ), + + AP_INIT_FLAG( "Auth_MySQL", enable_mysql, + NULL, + OR_AUTHCFG, "Enable MySQL authentication" ), + + AP_INIT_FLAG( "AuthMySQL", enable_mysql, + NULL, + OR_AUTHCFG, "Enable MySQL authentication" ), + + AP_INIT_TAKE1( "Auth_MySQL_Where", ap_set_string_slot, + (void*)APR_XtOffsetOf(mysql_auth_config_rec, password_where_clause), + OR_AUTHCFG, "Additional WHERE clause for group password/user-name lookup" ), + + { NULL } +}; +#else +command_rec mysql_auth_cmds[] = { + { "Auth_MySQL_Info", set_auth_mysql_info, + NULL, + RSRC_CONF, TAKE3, "host, user and password of the MySQL database" }, + + { "AuthMySQL_DefaultHost", set_auth_mysql_host, + NULL, + RSRC_CONF, TAKE1, "Default MySQL host" }, + + { "AuthMySQL_DefaultUser", set_auth_mysql_user, + NULL, + RSRC_CONF, TAKE1, "Default MySQL user" }, + + { "AuthMySQL_DefaultPassword", set_auth_mysql_pwd, + NULL, + RSRC_CONF, TAKE1, "Default MySQL password" }, + + { "Auth_MySQL_DefaultPort", set_auth_mysql_port, + NULL, + RSRC_CONF, TAKE1, "Default MySQL server port" }, + + { "Auth_MySQL_DefaultSocket", set_auth_mysql_socket, + NULL, + RSRC_CONF, TAKE1, "Default MySQL server socket" }, + + { "Auth_MySQL_General_DB", set_auth_mysql_db, + NULL, + RSRC_CONF, TAKE1, "default database for MySQL authentication" }, + + { "AuthMySQL_DefaultDB", set_auth_mysql_db, + NULL, + RSRC_CONF, TAKE1, "default database for MySQL authentication" }, + + { "AuthMySQL_Host", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, db_host), + OR_AUTHCFG, TAKE1, "database host" }, + + { "Auth_MySQL_Host", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, db_host), + OR_AUTHCFG, TAKE1, "database host" }, + + { "Auth_MySQL_Socket", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, db_socket), + OR_AUTHCFG, TAKE1, "database host socket" }, + + { "Auth_MySQL_Port", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, db_port), + OR_AUTHCFG, TAKE1, "database host socket" }, + + { "Auth_MySQL_Username", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, db_user), + OR_AUTHCFG, TAKE1, "database user" }, + + { "AuthMySQL_User", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, db_user), + OR_AUTHCFG, TAKE1, "database user" }, + + { "Auth_MySQL_Password", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, db_pwd), + OR_AUTHCFG, TAKE1, "database password" }, + + { "AuthMySQL_Password", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, db_pwd), + OR_AUTHCFG, TAKE1, "database password" }, + + { "Auth_MySQL_DB", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, db_name), + OR_AUTHCFG, TAKE1, "database name" }, + + { "AuthMySQL_DB", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, db_name), + OR_AUTHCFG, TAKE1, "database name" }, + + { "Auth_MySQL_Password_Table", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, user_table), + OR_AUTHCFG, TAKE1, "Name of the MySQL table containing the password/user-name combination" }, + + { "AuthMySQL_Password_Table", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, user_table), + OR_AUTHCFG, TAKE1, "Name of the MySQL table containing the password/user-name combination" }, + + { "Auth_MySQL_Group_Table", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, group_table), + OR_AUTHCFG, TAKE1, "Name of the MySQL table containing the group-name/user-name combination; can be the same as the password-table." }, + + { "Auth_MySQL_Group_Clause", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, group_where_clause), + OR_AUTHCFG, TAKE1, "Additional WHERE clause for group/user-name lookup" }, + + { "AuthMySQL_Group_Table", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, group_table), + OR_AUTHCFG, TAKE1, "Name of the MySQL table containing the group-name/user-name combination; can be the same as the password-table." }, + + { "Auth_MySQL_Password_Field", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, password_field), + OR_AUTHCFG, TAKE1, "The name of the field in the MySQL password table" }, + + { "AuthMySQL_Password_Field", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, password_field), + OR_AUTHCFG, TAKE1, "The name of the field in the MySQL password table" }, + + { "Auth_MySQL_Password_Clause", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, password_where_clause), + OR_AUTHCFG, TAKE1, "Additional WHERE clause for group password/user-name lookup" }, + + { "Auth_MySQL_Username_Field", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, user_field), + OR_AUTHCFG, TAKE1, "The name of the user-name field in the MySQL password (and possibly group) table(s)." }, + + { "AuthMySQL_Username_Field", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, user_field), + OR_AUTHCFG, TAKE1, "The name of the user-name field in the MySQL password (and possibly group) table(s)." }, + + { "Auth_MySQL_Group_Field", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, group_field), + OR_AUTHCFG, TAKE1, "The name of the group field in the MySQL group table; must be set if you want to use groups." }, + + { "AuthMySQL_Group_Field", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, group_field), + OR_AUTHCFG, TAKE1, "The name of the group field in the MySQL group table; must be set if you want to use groups." }, + + { "Auth_MySQL_Group_User_Field", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, group_user_field), + OR_AUTHCFG, TAKE1, "The name of the user-name field in the MySQL group table; defaults to the same as the username field for the password table." }, + + { "AuthMySQL_Group_User_Field", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, group_user_field), + OR_AUTHCFG, TAKE1, "The name of the user-name field in the MySQL group table; defaults to the same as the username field for the password table." }, + + { "Auth_MySQL_Empty_Passwords", ap_set_flag_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, allow_empty_passwords), + OR_AUTHCFG, FLAG, "Enable (on) or disable (off) empty password strings; in which case any user password is accepted." }, + + { "AuthMySQL_Empty_Passwords", ap_set_flag_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, allow_empty_passwords), + OR_AUTHCFG, FLAG, "Enable (on) or disable (off) empty password strings; in which case any user password is accepted." }, + + { "Auth_MySQL_Authoritative", ap_set_flag_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, authoritative), + OR_AUTHCFG, FLAG, "When 'on' the MySQL database is taken to be authoritative and access control is not passed along to other db or access modules." }, + + { "AuthMySQL_Authoritative", ap_set_flag_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, authoritative), + OR_AUTHCFG, FLAG, "When 'on' the MySQL database is taken to be authoritative and access control is not passed along to other db or access modules." }, + + { "AuthMySQL_AllowOverride", set_auth_mysql_override, + NULL, + RSRC_CONF, FLAG, "Allow directory overrides of configuration" }, + + { "Auth_MySQL_Encrypted_Passwords", set_crypted_password_flag, + NULL, + OR_AUTHCFG, FLAG, "When 'on' the password in the password table are taken to be crypt()ed using your machines crypt() function." }, + + { "AuthMySQL_Encrypted_Passwords", set_crypted_password_flag, + NULL, + OR_AUTHCFG, FLAG, "When 'on' the password in the password table are taken to be crypt()ed using your machines crypt() function." }, + + { "Auth_MySQL_Scrambled_Passwords", set_scrambled_password_flag, + NULL, + OR_AUTHCFG, FLAG, "When 'on' the password in the password table are taken to be scramble()d using mySQL's password() function." }, + + { "AuthMySQL_Scrambled_Passwords", set_scrambled_password_flag, + NULL, + OR_AUTHCFG, FLAG, "When 'on' the password in the password table are taken to be scramble()d using mySQL's password() function." }, + + { "Auth_MySQL_Encryption_Types", set_encryption_types, + NULL, + OR_AUTHCFG, ITERATE,"Encryption types to use" }, + + { "AuthMySQL_Encryption_Types", set_encryption_types, + NULL, + OR_AUTHCFG, ITERATE,"Encryption types to use" }, + + { "Auth_MySQL_Non_Persistent", set_non_persistent, + NULL, + OR_AUTHCFG, FLAG, "Use non-persistent MySQL links" }, + + { "AuthMySQL_Persistent", set_persistent, + NULL, + OR_AUTHCFG, FLAG, "Use non-persistent MySQL links" }, + + { "Auth_MySQL", enable_mysql, + NULL, + OR_AUTHCFG, FLAG, "Enable MySQL authentication" }, + + { "AuthMySQL", enable_mysql, + NULL, + OR_AUTHCFG, FLAG, "Enable MySQL authentication" }, + + { "Auth_MySQL_Where", ap_set_string_slot, + (void *) XtOffsetOf(mysql_auth_config_rec, password_where_clause), + OR_AUTHCFG, TAKE1, "Additional WHERE clause for group password/user-name lookup" }, + + { NULL } +}; + +/* { "Auth_MySQL", ap_set_flag_slot, (void *) XtOffsetOf(mysql_auth_config_rec, enable_mysql_auth), OR_AUTHCFG, FLAG, "Enable (on) or disable (off) MySQL authentication." }, + { "AuthMySQL", ap_set_flag_slot, (void *) XtOffsetOf(mysql_auth_config_rec, enable_mysql_auth), OR_AUTHCFG, FLAG, "Enable (on) or disable (off) MySQL authentication." }, +*/ + + +#endif + +#ifdef APACHE2 +static apr_status_t +#else +static void +#endif +auth_mysql_result_cleanup(void *result) +{ + mysql_free_result((MYSQL_RES *) result); +} + +#ifdef APACHE2 +static void note_cleanups_for_mysql_auth_result(apr_pool_t *p, MYSQL_RES * result) +#else +static void note_cleanups_for_mysql_auth_result(pool *p, MYSQL_RES * result) +#endif +{ +#ifdef APACHE2 + apr_pool_cleanup_register(p, (void *) result, auth_mysql_result_cleanup, auth_mysql_result_cleanup); +#else + ap_register_cleanup(p, (void *) result, auth_mysql_result_cleanup, auth_mysql_result_cleanup); +#endif + +} + +/* Make a MySQL database link open and ready for business. Returns 0 on + * success, or the MySQL error number which caused the failure if there was + * some sort of problem. + */ +static int open_auth_dblink(request_rec *r, mysql_auth_config_rec *sec) +{ + char *host = "localhost", *socket = NULL; + unsigned int port = 3306; + char *dbname = auth_db_name, *user = auth_db_user, *pwd = auth_db_pwd; + void (*sigpipe_handler)(); + unsigned long client_flag = 0; + + APACHELOG(APLOG_DEBUG, r, "Opening DB connection for %s", sec->dir); + + if (auth_db_host) { + host = auth_db_host; + } + + if (auth_db_socket) + { + socket = auth_db_socket; + } + + if (auth_db_port != -1) + { + port = auth_db_port; + } + + if (auth_db_override) + { + if (sec->db_socket) + { + socket = sec->db_socket; + } + + if (sec->db_port != -1) + { + port = sec->db_port; + } + + if (sec->db_host) + { + host = sec->db_host; + } + + if (sec->db_user) { + user = sec->db_user; + } + + if (sec->db_pwd) { + pwd = sec->db_pwd; + } + + if (sec->db_name) { + dbname = sec->db_name; + } + } + + if (!dbname || !dbname[0]) { + /* It would be preferred if we had somewhere to connect to... */ + APACHELOG(APLOG_CRIT, r, + "No database given - rather a problem. Bailing out."); + return CR_WRONG_HOST_INFO; + } + + /* MySQL likes to throw the odd SIGPIPE now and then - ignore it for now */ + sigpipe_handler = signal(SIGPIPE, SIG_IGN); + + sec->dbh = mysql_init(NULL); + + if (!mysql_real_connect(sec->dbh, host, user, pwd, dbname, port, socket, client_flag)) { + APACHELOG(APLOG_ERR, r, + "Connection error: %s", mysql_error(sec->dbh)); + errno = mysql_errno(sec->dbh); + mysql_close(sec->dbh); + sec->dbh = NULL; + return errno; + } + + signal(SIGPIPE, sigpipe_handler); + + APACHELOG(APLOG_DEBUG, r, "Persistent in %s is %i", sec->dir, sec->persistent); + + if (!sec->persistent) { + APACHELOG(APLOG_DEBUG, r, "Registering non-persistent for %s", sec->dir); +#ifdef APACHE2 + apr_pool_cleanup_register(r->pool, sec, auth_mysql_cleanup, apr_pool_cleanup_null); +#else + ap_block_alarms(); + ap_register_cleanup(r->pool, sec, auth_mysql_cleanup, ap_null_cleanup); + ap_unblock_alarms(); +#endif + } + + /* W00t! We made it! */ + return 0; +} + +/* Run a query against the database. Doesn't assume nearly anything about + * the state of affairs regarding the database connection. + * Returns 0 on a successful query run, or the MySQL error number on + * error. It is the responsibility of the calling function to retrieve any + * data which may have been obtained through the running of this function. + */ +static int safe_mysql_query(request_rec *r, char *query, mysql_auth_config_rec *sec) +{ + int error = CR_UNKNOWN_ERROR; + + APACHELOG(APLOG_DEBUG, r, "sec->dbh in %s is %p", sec->dir, sec->dbh); + if (sec->dbh_error_lastchance) + { + APACHELOG(APLOG_DEBUG, r, "Last chance, bub"); + } + else + { + APACHELOG(APLOG_DEBUG, r, "Ordinary query"); + } + + if (!sec->dbh) { + APACHELOG(APLOG_DEBUG, r, + "No DB connection open - firing one up"); + if ((error = open_auth_dblink(r, sec))) { + APACHELOG(APLOG_DEBUG, r, + "open_auth_dblink returned %i", error); + return error; + } + + APACHELOG(APLOG_DEBUG, r, + "Correctly opened a new DB connection"); + } + + APACHELOG(APLOG_DEBUG, r, + "Running query: [%s]", query); + + if (mysql_query(sec->dbh, query)) { + error = mysql_errno(sec->dbh); + + APACHELOG(APLOG_DEBUG, r, + "Query maybe-failed: %s (%i), lastchance=%i", mysql_error(sec->dbh), error, sec->dbh_error_lastchance); + APACHELOG(APLOG_DEBUG, r, + "Error numbers of interest are %i (SG) and %i (SL)", + CR_SERVER_GONE_ERROR, CR_SERVER_LOST); + if (sec->dbh_error_lastchance) + { + /* No matter what error, we're moving out */ + return error; + } + else if (error == CR_SERVER_LOST || error == CR_SERVER_GONE_ERROR) + { + /* Try again, once more only */ + sec->dbh_error_lastchance = 1; + sec->dbh = NULL; + APACHELOG(APLOG_DEBUG, r, "Retrying query"); + return safe_mysql_query(r, query, sec); + } + else + { + return error; + } + } + + return 0; +} + +/* Store the result of a query in a result structure, and return it. It's + * "safe" in the fact that a cleanup function is registered for the structure + * so it will be tidied up after the request. + * Returns the result data on success, or NULL if there was no data to retrieve. + */ +#ifdef APACHE2 +static MYSQL_RES *safe_mysql_store_result(apr_pool_t *p, mysql_auth_config_rec *sec) +#else +static MYSQL_RES *safe_mysql_store_result(pool *p, mysql_auth_config_rec *sec) +#endif +{ + MYSQL_RES *result; +#ifdef APACHE2 +#else + ap_block_alarms(); +#endif + + result = mysql_store_result(sec->dbh); +#ifdef DEBUG + syslog(LOG_DEBUG, "MAMDEBUG: Got %p for result", result); +#endif + + if (result) { + note_cleanups_for_mysql_auth_result(p, result); + } +#ifdef APACHE2 +#else + ap_unblock_alarms(); +#endif + + return result; +} + +/* Check the plaintext password given against the hashed version. Go + * through all configured encryption types looking for a match. + * Returns 1 on a match, 0 on no match, and -1 on error. + */ +static int check_password(const char *plaintext, char *hashed, request_rec *r, mysql_auth_config_rec *sec) +{ + encryption_type_entry *ete; + + /* empty password support */ + if (sec->allow_empty_passwords && !strlen(hashed)) { + APACHELOG(APLOG_INFO, r, "User successful on empty password"); + return 1; + } + + for (ete=supported_encryption_types; ete->name; ete++) { + if (sec->encryption_types & ete->flag) { + APACHELOG(APLOG_DEBUG, r, + "Checking with %s", ete->name); + if (ete->check_function(plaintext, hashed)) { + APACHELOG(APLOG_DEBUG, r, "Auth succeeded"); + return 1; + } + } + } + APACHELOG(APLOG_DEBUG, r, "User failed all encryption types"); + return 0; +} + +/* Checks whether the username and plaintext password match the user data + * stored in the database, against all configured encryption schemes. + * Returns 1 on successful match, 0 unsuccessful match, -1 on error. + */ +static int mysql_check_user_password(request_rec *r, char *user, const char *password, mysql_auth_config_rec *sec) +{ + char *auth_table = "mysql_auth", *auth_user_field = "username", + *auth_password_field = "passwd", *auth_password_clause = ""; + char *query; + char *esc_user = mysql_escape(user, r->pool); + MYSQL_RES *result; + MYSQL_ROW sql_row; + int rv; + + if (sec->user_table) { + auth_table = sec->user_table; + } + if (sec->user_field) { + auth_user_field = sec->user_field; + } + if (sec->password_field) { + auth_password_field = sec->password_field; + } + if (sec->password_where_clause) { + auth_password_clause = sec->password_where_clause; + } + APACHELOG(APLOG_DEBUG, r, + "Constructing password collection query with " + "passfield=[%s], table=[%s], userfield=[%s], where_clause=[%s]", auth_password_field + , auth_table, esc_user,auth_password_clause); + + query = (char *) PSTRCAT(r->pool, "SELECT ", auth_password_field, + " FROM ", auth_table, " WHERE ", + auth_user_field, "='", esc_user, "'", + auth_password_clause, NULL); + if (!query) { + APACHELOG(APLOG_ERR, r, + "Failed to create query string - we're in deep poopy"); + return -1; + } + + if ((rv = safe_mysql_query(r, query, sec))) { + if (sec->dbh) + { + APACHELOG(APLOG_ERR, r, + "Query call failed: %s (%i)", mysql_error(sec->dbh), rv); + } + + APACHELOG(APLOG_DEBUG, r, "Failed query was: [%s]", query); + return -1; + } + + result = safe_mysql_store_result(r->pool, sec); + if (!result) { + APACHELOG(APLOG_ERR, r, + "Failed to get MySQL result structure : %s", mysql_error(sec->dbh)); + return -1; + } + switch (mysql_num_rows(result)) { + case 0: + APACHELOG(APLOG_INFO, r, "User not found"); + return 0; + break; + case 1: + sql_row = mysql_fetch_row(result); + /* ensure we have a row, and non NULL value */ + if (!sql_row || !sql_row[0]) { + APACHELOG(APLOG_INFO, r, + "No row returned or NULL value: %s", mysql_error(sec->dbh)); + return -1; + } + + rv = check_password(password, sql_row[0], r, sec); + if (rv == 0) + { + APACHELOG(APLOG_INFO, r, + "Authentication failed for user %s", user); + } + return rv; + break; + + default: + APACHELOG(APLOG_ERR, r, + "Multiple password rows returned - this is what is known, in the industry, as a Bad Thing"); + return -1; + break; + } + + APACHELOG(APLOG_CRIT, r, "Can't happen - dropped out of switch!"); + return -1; +} + +/* Has a look to see if the given user is a member of the named group. + * Returns 0 if user is not a part of the group, 1 if he is, -1 on error. + */ +static int mysql_check_group(request_rec *r, char *user, char *group, mysql_auth_config_rec *sec) +{ + char *auth_table = "mysql_auth", *auth_group_field="groups", *auth_group_clause=""; + char *query; + char *esc_user = mysql_escape(user, r->pool); + char *esc_group = mysql_escape(group, r->pool); + MYSQL_RES *result; + MYSQL_ROW row; + char *auth_user_field = "username"; + + if (!group) { + APACHELOG(APLOG_ERR, r, "No group specified"); + return 0; + } + + if (sec->group_table) { + auth_table = sec->group_table; + } + + if (sec->user_field) + { + auth_user_field = sec->user_field; + } + + if (sec->group_user_field) { + auth_user_field = sec->group_user_field; + } + + if (sec->group_field) { + auth_group_field = sec->group_field; + } + if (sec->group_where_clause) { + auth_group_clause = sec->group_where_clause; + } + + APACHELOG(APLOG_DEBUG, r, + "Making group query with auth_table=[%s], auth_user_field=[%s], " + "esc_user=[%s], esc_group=[%s], auth_group_field=[%s], where_clause=[%s]", + auth_table, auth_user_field, esc_user, esc_group, auth_group_field,auth_group_clause); + + query = (char *) PSTRCAT(r->pool, "SELECT count(*) FROM ", auth_table, + " WHERE ", auth_user_field, "='", esc_user, "'", + " and FIND_IN_SET('", esc_group, "',", auth_group_field, ")", + auth_group_clause, NULL); + + APACHELOG(APLOG_DEBUG, r, "Group query created; [%s]", query); + + if (!query) { + APACHELOG(APLOG_CRIT, r, + "Failed to create group-check query - ran out of memory!"); + return -1; + } + if (safe_mysql_query(r, query, sec)) { + APACHELOG(APLOG_CRIT, r, "Group query failed!"); + return -1; + } + result = safe_mysql_store_result(r->pool, sec); + if (!result || (row=mysql_fetch_row(result))==NULL || !row[0]) { + APACHELOG(APLOG_CRIT, r, "Store result failed - erp!"); + return -1; + } + + return atoi(row[0]); +} + +/* The apache-called function. Note that this function says nothing about + * what the user should be allowed to do - merely that they have proved they + * are who they say they are. Return OK if the user has proved their + * identity, DECLINED if we are not taking any responsibility for them, or + * some Apache error if there was a problem. + */ +int mysql_authenticate_basic_user(request_rec *r) +{ + mysql_auth_config_rec *sec = (mysql_auth_config_rec *) ap_get_module_config(r->per_dir_config, &auth_mysql_module); + conn_rec *c = r->connection; + const char *sent_pw; + int res; + + APACHELOG(APLOG_DEBUG, r, "Handling an authentication request for section %s", sec->dir); + +#ifdef DEBUG + for (res = 0; res < 512; res++) + { + if (sec->sacrificial_lamb[res] == '\0') + { + sec->sacrificial_lamb[res] = 'n'; + } + if (!isgraph(sec->sacrificial_lamb[res])) + { + sec->sacrificial_lamb[res] = ' '; + } + } + sec->sacrificial_lamb[511] = '\0'; + + syslog(LOG_DEBUG, "The contents of the lamb are %s", sec->sacrificial_lamb); +#endif + + if (!sec->enable_mysql_auth) { + APACHELOG(APLOG_DEBUG, r, + "Not running mod-auth-mysql for %s - disabled", r->unparsed_uri); + return DECLINED; + } + + /* use MySQL auth only if we have a database */ + if (!auth_db_name && !sec->db_name) { + APACHELOG(APLOG_ERR, r, + "Failed to run mod-auth-mysql for %s: No database name specified", r->unparsed_uri); + return DECLINED; + } + + /* obtain sent password */ + if ((res = ap_get_basic_auth_pw(r, &sent_pw))) { + return res; + } + +#ifdef APACHE2 + APACHELOG(APLOG_DEBUG, r, + "Starting basic user auth for [%s] in %s, child pid %i", + r->user, + sec->dir, getpid()); +#else + APACHELOG(APLOG_DEBUG, r, + "Starting basic user auth for [%s] in %s, child pid %i", + c->user, + sec->dir, getpid()); +#endif + +#ifdef APACHE2 + switch (mysql_check_user_password(r, r->user, sent_pw, sec)) { +#else + switch (mysql_check_user_password(r, c->user, sent_pw, sec)) { +#endif + case 0: + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + break; + case 1: + return OK; + break; + case -1: + default: + APACHELOG(APLOG_DEBUG, r, + "mysql_check_user_password returned error"); + return HTTP_INTERNAL_SERVER_ERROR; + break; + } +} + +/* Go through a 'requires' line configured for the module, and return OK + * if the user satisfies the line, or some sort of failure return code + * otherwise. + */ +int check_mysql_auth_require(char *user, const char *t, request_rec *r) +{ + mysql_auth_config_rec *sec = (mysql_auth_config_rec *) ap_get_module_config(r->per_dir_config, &auth_mysql_module); + const char *w; + int rv; + + w = ap_getword(r->pool, &t, ' '); + /* If they're letting any old authenticated user, we're off the + * hook! + */ + if (!strcmp(w, "valid-user")) { + return OK; + } + + /* Checking a list of usernames */ + if (!strcmp(w, "user")) { + while (t[0]) { + w = ap_getword_conf(r->pool, &t); + if (!strcmp(user, w)) { + return OK; + } + } + /* Not found */ + return HTTP_UNAUTHORIZED; + } else if (!strcmp(w, "group")) { + /* This is the prickly one; checking whether the + * user is a member of a listed group. + */ + while (t[0]) + { + w = ap_getword_conf(r->pool, &t); + rv = mysql_check_group(r, user, (char *)w, sec); + + if (rv == 1) + { + /* Yep, we're all good */ + return OK; + } + else if (rv == -1) + { + return HTTP_INTERNAL_SERVER_ERROR; + } + } + /* Distinct lack of foundage */ + return HTTP_UNAUTHORIZED; + } + else + { + APACHELOG(APLOG_ERR, r, "Invalid argument to require: %s", w); + return HTTP_INTERNAL_SERVER_ERROR; + } + + APACHELOG(APLOG_ERR, r, "CAN'T HAPPEN: Dropped out of the bottom of check_mysql_auth_require!"); + return HTTP_INTERNAL_SERVER_ERROR; +} + +/* This is the authorization step. We're presuming that the user has + * successfully negotiated the step of "I am who I say I am", now we're + * checking to see if the user has permission to access this particular + * resource. As with mysql_authenticate_basic_user, above, we return OK if + * the user is fit to proceed, DECLINED if we don't want to make a decision + * either way, HTTP_UNAUTHORIZED if the user is not allowed, or some apache + * error if there was a major problem. + */ +int mysql_check_auth(request_rec *r) +{ + mysql_auth_config_rec *sec = (mysql_auth_config_rec *) ap_get_module_config(r->per_dir_config, &auth_mysql_module); +#ifdef APACHE2 + char *user = r->user; +#else + char *user = r->connection->user; +#endif + int m = r->method_number; + int rv; + register int x; + const char *t; +#ifdef APACHE2 + const apr_array_header_t *reqs_arr = ap_requires(r); +#else + const array_header *reqs_arr = ap_requires(r); +#endif + require_line *reqs; + + /* use MySQL auth only if we have a database */ + if (!auth_db_name && !sec->db_name) { + return DECLINED; + } + + /* What do we do if there's no requires line available? Either say + * "bad puppy" if we're king shit, or say "not my problem" otherwise. + */ + if (!reqs_arr) { + if (sec->authoritative) { + APACHELOG(APLOG_ERR, r, "No requires line available"); + return HTTP_UNAUTHORIZED; + } else { + return DECLINED; + } + } + + /* This is an array of all the requires lines which apply to us. + * There may be several, as in the case of something like: + * require user foo bar + * require group wombat + * That is, the user either has to belong to the group 'wombat' or + * be 'foo' or 'bar'. + * We have to check them all. Yuck. + */ + reqs = (require_line *) reqs_arr->elts; + + for (x = 0; x < reqs_arr->nelts; x++) { + /* mjp: WTF is this? */ + if (!(reqs[x].method_mask & (1 << m))) { + continue; + } + + t = reqs[x].requirement; + + /* OK, this might seem a little weird. The logic is that, + * if the user is approved, that's sufficient, so we can + * return OK straight away. Alternately, if there's an + * error, we bomb the check and die. The only circumstance + * where we continue looping is when the user didn't pass this + * check, but might pass a future one, so keep looking. + */ + if ((rv = check_mysql_auth_require(user, t, r)) + != HTTP_UNAUTHORIZED) + { + return rv; + } + } + + /* We don't know, and we don't really care */ + if (!(sec->authoritative)) { + return DECLINED; + } + + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; +} + + + +#ifdef APACHE2 +static void register_hooks(apr_pool_t *p) +{ + ap_hook_check_user_id(mysql_authenticate_basic_user, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_auth_checker(mysql_check_auth, NULL, NULL, APR_HOOK_MIDDLE); +} +#endif + +#ifdef APACHE2 +module AP_MODULE_DECLARE_DATA auth_mysql_module = +{ +STANDARD20_MODULE_STUFF, +create_mysql_auth_dir_config, /* dir config creater */ +NULL, /* dir merger --- default is to override */ +NULL, /* server config */ +NULL, /* merge server config */ +mysql_auth_cmds, /* command apr_table_t */ +register_hooks /* register hooks */ +}; +#else +module auth_mysql_module = +{ + STANDARD_MODULE_STUFF, + mysql_auth_init_handler, /* initializer */ + create_mysql_auth_dir_config, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + mysql_auth_cmds, /* command table */ + NULL, /* handlers */ + NULL, /* filename translation */ + mysql_authenticate_basic_user, /* check_user_id */ + mysql_check_auth, /* check auth */ + NULL, /* check access */ + NULL, /* type_checker */ + NULL, /* pre-run fixups */ + NULL /* logger */ +#if MODULE_MAGIC_NUMBER >= 19970103 + ,NULL /* header parser */ +#endif +#if MODULE_MAGIC_NUMBER >= 19970719 + ,NULL /* child_init */ +#endif +#if MODULE_MAGIC_NUMBER >= 19970728 + ,NULL /* child_exit */ +#endif +#if MODULE_MAGIC_NUMBER >= 19970902 + ,NULL /* post read-request */ +#endif +}; +#endif -- 2.20.1