Added Kostas Kalevras' <kkalev@noc.ntua.gr> attr_rewrite module. It's still
authorcmiller <cmiller>
Fri, 13 Jul 2001 20:04:47 +0000 (20:04 +0000)
committercmiller <cmiller>
Fri, 13 Jul 2001 20:04:47 +0000 (20:04 +0000)
experimental, but shows a lot of promise.

raddb/radiusd.conf.in
src/modules/rlm_attr_rewrite/Makefile.in [new file with mode: 0644]
src/modules/rlm_attr_rewrite/config.h.in [new file with mode: 0644]
src/modules/rlm_attr_rewrite/configure [new file with mode: 0755]
src/modules/rlm_attr_rewrite/configure.in [new file with mode: 0644]
src/modules/rlm_attr_rewrite/rlm_attr_rewrite.c [new file with mode: 0644]

index 579dd17..30d8d76 100644 (file)
@@ -4,14 +4,12 @@
 ##     http://www.freeradius.org/
 ##
 
-#
 #      The location of other config files and
 #      logfiles are declared in this file
 #
 #      Also general configuration for modules can be done
 #      in this file, it is exported through the API to
 #      modules that ask for it.
-#
 
 # Stuff from autoconf
 prefix = @prefix@
@@ -24,24 +22,19 @@ libdir = @libdir@
 raddbdir = @raddbdir@
 radacctdir = @radacctdir@
 
-#
 #  Location of config and logfiles.
-#
 confdir = ${raddbdir}
-
 run_dir = ${localstatedir}/run
 
-#
 #  pidfile: Where to place the PID of the RADIUS server.
 #
 #  The server may be signalled while it's running by using this
 #  file.
 #
 #  e.g.:  kill -HUP `cat /var/run/radiusd.pid`
-#
 pidfile = ${run_dir}/radiusd.pid
 
-#
+
 # user/group: The name (or #number) of the user/group to run httpd as.
 #    On SCO (ODT 3) use "user = nouser" and "group = nogroup".
 #    On HPUX you may not be able to use shared memory as nobody, and the
@@ -52,12 +45,13 @@ pidfile = ${run_dir}/radiusd.pid
 #  don't use group nobody on these systems!
 #
 #  On systems with shadow passwords, you might have to set 'group = shadow'
-#  for the server to be able to read the shadow password file.
-#
+#  for the server to be able to read the shadow password file.  If you can
+#  authenticate users whil in debug mode, but not in normal use, it may be
+#  because the debugged server is running as a user that can read the shadow
+#  info, and the below user can not.
 user = nobody
 group = nobody
 
-#
 #  max_request_time: The maximum time (in seconds) to handle a request.
 #
 #  Requests which take more time than this to process may be killed, and
@@ -68,10 +62,8 @@ group = nobody
 #  used to handle a request.
 #
 #  Useful range of values: 5 to 120
-#
 max_request_time = 30
 
-#
 #  delete_blocked_requests: If the request takes MORE THAN 'max_request_time'
 #  to be handled, then maybe the server should delete it.
 #
@@ -81,7 +73,6 @@ max_request_time = 30
 #
 delete_blocked_requests = no
 
-#
 #  cleanup_delay: The time to wait (in seconds) before cleaning up
 #  a reply which was sent to the NAS.
 #
@@ -98,10 +89,8 @@ delete_blocked_requests = no
 #  requests, and some new requests may get blocked.  (See 'max_requests'.)
 #
 #  Useful range of values: 2 to 10
-#
 cleanup_delay = 5
 
-#
 #  max_requests: The maximum number of requests which the server keeps
 #  track of.  This should be 256 multiplied by the number of clients.
 #  e.g. With 4 clients, this number should be 1024.
@@ -118,20 +107,16 @@ cleanup_delay = 5
 #  the highest it should be.
 #
 #  Useful range of values: 256 to infinity
-#
 max_requests = 1024
 
-#
 #  bind_address:  Make the server listen on a particular IP address, and
 #  send replies out from that address.  This directive is most useful
 #  for machines with multiple IP addresses on one interface.
 #
 #  It can either contain "*", or an IP address, or a fully qualified
 #  Internet domain name.  The default is "*"
-#
 bind_address = *
 
-#
 #  port: Allows you to bind FreeRADIUS to a specific port.
 #
 #  The default port that most NAS boxes use is 1645, which is historical.
@@ -146,15 +131,11 @@ bind_address = *
 #  (usually through 'grep radius /etc/services') set this to 0 (zero).
 #
 #  A port given on the command-line via '-p' over-rides this one.
-#
 port = 0
 
-#
 #  Which program to execute check doing concurrency checks.
-#
 checkrad = ${sbindir}/checkrad
 
-#
 #  hostname_lookups: Log the names of clients or just their IP addresses
 #  e.g., www.freeradius.org (on) or 206.47.27.232 (off).
 #  The default is off because it'd be overall better for the net if people
@@ -166,19 +147,15 @@ checkrad = ${sbindir}/checkrad
 #  for 30 seconds, if it sees an IP address which has no name associated
 #  with it.
 #
-# allowed values: {no, yes}
-#
+#  allowed values: {no, yes}
 hostname_lookups = no
 
-#
 #  Core dumps are a bad thing.  This should only be set to 'yes'
 #  if you're debugging a problem with the server.
 #
-# allowed values: {no, yes}
-#
+#  allowed values: {no, yes}
 allow_core_dumps = no
 
-#
 #  Regular expressions
 #
 #  These items are set at configure time.  If they're set to "yes",
@@ -186,44 +163,35 @@ allow_core_dumps = no
 #
 #  If they're set to "no" at configure time, then setting them to "yes"
 #  WILL NOT WORK.  It will give you an error.
-#
 regular_expressions    = @REGEX@
 extended_expressions   = @REGEX_EXTENDED@
 
-#
 #  Log the full User-Name attribute, as it was found in the request.
 #
 # allowed values: {no, yes}
-#
 log_stripped_names = no
 
-#
 #  Log authentication requests to the log file.
 #
-# allowed values: {no, yes}
-#
+#  allowed values: {no, yes}
 log_auth = no
 
-#
 #  Log passwords with the authentication requests.
 #  log_auth_badpass  - logs password if it's rejected
 #  log_auth_goodpass - logs password if it's correct
 #
-# allowed values: {no, yes}
-#
+#  allowed values: {no, yes}
 log_auth_badpass = no
 log_auth_goodpass = no
 
-# 
-# usercollide:  Turn user collision code on and off.
-#              See doc/duplicate-users
-#
+# usercollide:  Turn "username collision" code on and off.  See the
+# "duplicate-users" documentation
 usercollide = no
 
 # lower_user / lower_pass:  
 # Lowercase the username/password "before" or "after"
 # attempting to authenticate.  
-
+#
 # If "before", the server will first modify the request
 # and then try to auth the user.  If "after", the server
 # will first auth using the values provided by the
@@ -236,7 +204,6 @@ usercollide = no
 #
 # Default is 'no' (don't lowercase values)
 # Valid values = "before" / "after" / "no"
-#
 lower_user = no
 lower_pass = no
 
@@ -247,14 +214,9 @@ lower_pass = no
 #
 # Default is 'no' (don't remove spaces)
 # Valid values = "before" / "after" / "no" (explanation above)
-#
 nospace_user = no
 nospace_pass = no
 
-#######################################################################
-#
-#  Include optional/module specific configurations.
-
 
 # PROXY CONFIGURATION
 #
@@ -267,13 +229,14 @@ nospace_pass = no
 #  If you have proxying turned off, and your configuration files say
 #  to proxy a request, then an error message will be logged.
 #
-# allowed values: {no, yes}
-#
 #  To disable proxying, change the "yes" to "no", and comment the
 #  $INCLUDE line.
+#
+#  allowed values: {no, yes}
 proxy_requests  = yes
 $INCLUDE  ${confdir}/proxy.conf
 
+
 # CLIENTS CONFIGURATION
 #
 #  Client configuration is defined in "clients.conf".  If you don't
@@ -283,6 +246,7 @@ $INCLUDE  ${confdir}/proxy.conf
 #
 $INCLUDE  ${confdir}/clients.conf
 
+
 # SNMP CONFIGURATION
 #
 #  Snmp configuration is only valid if you enabled SNMP support when
@@ -291,9 +255,7 @@ $INCLUDE  ${confdir}/clients.conf
 $INCLUDE  ${confdir}/snmp.conf
 
 
-#######################################################################
-#
-#  Thread pool configuration.
+# THREAD POOL CONFIGURATION
 #
 #  The thread pool is a long-lived group of threads which
 #  take turns (round-robin) handling any incoming requests.
@@ -309,55 +271,47 @@ $INCLUDE  ${confdir}/snmp.conf
 #  not doing anything productive.
 #
 #  The numbers given below should be adequate for most situations.
-#
-#
 thread pool {
-#
-#  Number of servers to start initially --- should be a reasonable ballpark
-#  figure.
-#
+       #  Number of servers to start initially --- should be a reasonable
+       #  ballpark figure.
        start_servers = 5
 
-#
-#  Limit on the total number of servers running.
-#
-#  If this limit is ever reached, clients will be LOCKED OUT, so it
-#  should NOT BE SET TOO LOW.  It is intended mainly as a brake to
-#  keep a runaway server from taking the system with it as it spirals
-#  down...
-#
+       #  Limit on the total number of servers running.
+       #
+       #  If this limit is ever reached, clients will be LOCKED OUT, so it
+       #  should NOT BE SET TOO LOW.  It is intended mainly as a brake to
+       #  keep a runaway server from taking the system with it as it spirals
+       #  down...
        max_servers = 32
 
-#
-#  Server-pool size regulation.  Rather than making you guess how many
-#  servers you need, FreeRADIUS dynamically adapts to the load it
-#  sees --- that is, it tries to maintain enough servers to
-#  handle the current load, plus a few spare servers to handle transient
-#  load spikes.
-#
-#  It does this by periodically checking how many servers are waiting
-#  for a request.  If there are fewer than min_spare_servers, it creates
-#  a new spare.  If there are more than max_spare_servers, some of the
-#  spares die off.  The default values are probably OK for most sites.
-#
+       #  Server-pool size regulation.  Rather than making you guess how many
+       #  servers you need, FreeRADIUS dynamically adapts to the load it sees
+       #  --- that is, it tries to maintain enough servers to handle the
+       #  current load, plus a few spare servers to handle transient load
+       #  spikes.
+       #
+       #  It does this by periodically checking how many servers are waiting
+       #  for a request.  If there are fewer than min_spare_servers, it
+       #  creates a new spare.  If there are more than max_spare_servers, some
+       #  of the spares die off.  The default values are probably OK for most
+       #  sites.
        min_spare_servers = 3
        max_spare_servers = 10
 
-#
-#  There may be memory leaks or resource allocation problems with
-#  the server.  If so, set this value to 300 or so, so that the
-#  resources will be cleaned up periodically.
-#
-#  This should only be necessary if there are serious bugs in the
-#  server which have not yet been fixed.
-#
-#  '0' is a special value meaning 'infinity', or 'the servers never exit'
-#
+       #  There may be memory leaks or resource allocation problems with
+       #  the server.  If so, set this value to 300 or so, so that the
+       #  resources will be cleaned up periodically.
+       #
+       #  This should only be necessary if there are serious bugs in the
+       #  server which have not yet been fixed.
+       #
+       #  '0' is a special value meaning 'infinity', or 'the servers never
+       #  exit'
        max_requests_per_server = 0
 }
 
 modules {
-##     pam {
+       pam {
                #
                #  The name to use for PAM authentication.
                #  PAM looks in /etc/pam.d/${pam_auth_name}
@@ -366,8 +320,8 @@ modules {
                #  Note that any Pam-Auth attribute set in the 'users'
                #  file over-rides this one.
                #
-##             pam_auth = radiusd
-##     }
+               pam_auth = radiusd
+       }
        unix {
                #
                #  Cache /etc/passwd, /etc/shadow, and /etc/group
@@ -397,10 +351,10 @@ modules {
                radwtmp = ${logdir}/radwtmp
        }
 
-       # This module definition allows you to use LDAP for
-       # authorization and authentication (Auth-Type = LDAP)
-       # See doc/rlm_ldap for description of configuration options 
-       # and sample authorize{} and authenticate{} blocks 
+       #  This module definition allows you to use LDAP for
+       #  authorization and authentication (Auth-Type = LDAP)
+       #  See doc/rlm_ldap for description of configuration options 
+       #  and sample authorize{} and authenticate{} blocks 
        ldap {
                server = "ldap.your.domain"
                # identity = "cn=admin,o=My Org,c=UA"
@@ -417,7 +371,6 @@ modules {
                net_timeout = 1
        }
 
-       #
        #  You can have multiple instances of the realm module to
        #  support multiple realm syntaxs at the same time.  The
        #  search order is defined the order in the authorize and
@@ -434,47 +387,50 @@ modules {
                delimiter = "@"
        }
 
-       #
        #  'realm/username'
        #
        #  Using this entry, IPASS users have their realm set to "IPASS".
-       #
-       #realm prefix {
-       #       format = prefix
-       #       delimiter = "/"
-       #}
+       realm realmslash {
+               format = prefix
+               delimiter = "/"
+       }
 
-       #
        #  'username%realm'
-       #
-       #realm percent {
-       #       format = suffix
-       #       delimiter = "%"
-       #}
+       realm realmpercent {
+               format = suffix
+               delimiter = "%"
+       }
        
+       #  rewrite arbitrary packets.  Useful in accounting and authorization.
+       ## FIXME:  This is highly experimental at the moment.  Please give 
+       ## feedback.
+       attr_rewrite sanecallerid {
+               attribute = Called-Station-Id
+               # may be "packet", "reply", or "config"
+               searchin = packet
+               searchfor = "[+ ]"
+               replacewith = ""
+               ignore_case = no
+               max_matches = 10
+       }
 
        preprocess {
                huntgroups = ${confdir}/huntgroups
                hints = ${confdir}/hints
 
-               #
                # This hack changes Ascend's wierd port numberings
                # to standard 0-??? port numbers so that the "+" works
                # for IP address assignments.
-               #
                with_ascend_hack = no
                ascend_channels_per_line = 23
 
-               #
                # Windows NT machines often authenticate themselves as
                # NT_DOMAIN\username
                #
                # If this is set to 'yes', then the NT_DOMAIN portion
                # of the user-name is silently discarded.
-               #
                with_ntdomain_hack = no
 
-               #
                # Specialix Jetstream 8500 24 port access server.
                #
                # If the user name is 10 characters or longer, a "/"
@@ -483,10 +439,8 @@ modules {
                #
                # If you're not running that NAS, you don't need
                # this hack.
-               #
                with_specialix_jetstream_hack = no
 
-               #
                # Cisco sends it's VSA attributes with the attribute
                # name *again* in the string, like:
                #
@@ -500,7 +454,6 @@ modules {
                #
                # If you're not running a Cisco NAS, you don't need
                # this hack.
-               #
                with_cisco_vsa_hack = no
        }
 
@@ -508,12 +461,10 @@ modules {
                usersfile = ${confdir}/users
                acctusersfile = ${confdir}/acct_users
 
-               #
                #  If you want to use the old Cistron 'users' file
                #  with FreeRADIUS, you should change the next line
                #  to 'compat = cistron'.  You can the copy your 'users'
                #  file from Cistron.
-               #
                compat = no
        }
 
@@ -528,7 +479,6 @@ modules {
        }
        
        detail {
-               #
                #  Note that we do NOT use NAS-IP-Address here, as that
                #  attribute MAY BE from the originating NAS, and NOT
                #  from the proxy which actually sent us the request.
@@ -546,8 +496,12 @@ modules {
                key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port-Id"
        }
 
+
+       # Include another file that has SQL-related stuff in it.  
+       # This is another file solely because it tends to be big.
        $INCLUDE  ${confdir}/sql.conf
 
+
        radutmp {
                filename = ${logdir}/radutmp
                perm = 0600
@@ -567,20 +521,13 @@ modules {
                callerid = "no"
        }
 
-       #
        # attr_filter - filters the attributes received in replies from
        # proxy servers, to make sure we send back to the upstream
        # only allowed attributes.
-       #
-  
        attr_filter {
                attrsfile = ${confdir}/attrs
        }
 
-       #######################################################################
-       #
-       #  Configuration for the counter module
-       #
        #  This module takes an attribute (count-attribute), which MUST
        #  be an 'integer' or 'time' attribute.  It also takes a key,
        #  and creates a counter for each unique key.  The count is
@@ -596,7 +543,6 @@ modules {
        #
        #  DEFAULT  Daily-Session-Time > 3600, Auth-Type = Reject
        #      Reply-Message = "You've used up more than one hour today"
-       #
        counter {
                filename = ${raddbdir}/db.counter
                key = User-Name
@@ -610,67 +556,67 @@ modules {
 
        # The "always" module is here for debugging purposes. Each instance simply
        # returns the same result, always, without doing anything.
-       #
-       #always fail {
-       #       rcode = fail
-       #}
-       #always reject {
-       #       rcode = reject
-       #}
-       #always ok {
-       #       rcode = ok
-       #       simulcount = 0
-       #       mpp = no
-       #}
-
-       #######################################################################
-       #
-       #       Configuration for the example module.  Uncommenting it will cause it
-       #       to get loaded and initialized, but should have no real effect as long
-       #       it is not referencened in one of the autz/auth/preacct/acct sections
-       #
+       always fail {
+               rcode = fail
+       }
+       always reject {
+               rcode = reject
+       }
+       always ok {
+               rcode = ok
+               simulcount = 0
+               mpp = no
+       }
+
+       # Configuration for the example module.  Uncommenting it will cause it
+       # to get loaded and initialized, but should have no real effect as long
+       # it is not referencened in one of the autz/auth/preacct/acct sections
        example {
-       #
-       #  Boolean variable.
-       #
-       # allowed values: {no, yes}
-       #
+               #  Boolean variable.
+               # allowed values: {no, yes}
                boolean = yes
 
-       #
-       #  An integer, of any value.
-       #
+               #  An integer, of any value.
                integer = 16
 
-       #
-       #  A string.
-       #
+               #  A string.
                string = "This is an example configuration string"
 
-       #
-       # An IP address, either in dotted quad (1.2.3.4) or hostname
-       # (example.com)
-       #
+               # An IP address, either in dotted quad (1.2.3.4) or hostname
+               # (example.com)
                ipaddr = 127.0.0.1
 
-       #
-       # A subsection
-       #
+               # A subsection
                mysubsection {
                        anotherinteger = 1000
-       #
-       # They nest
-       #
+                       # They nest
                        deeply nested {
                                string = "This is a different string"
                        }
                }
        }
+
 }
 
-# Authentication types, Auth-Type = System for now.
+
+
+# Authorization. First preprocess (hints and huntgroups files),
+# then realms, and finally look in the "users" file.
+# The order of the realm modules will determine the order that
+# we try to find a matching realm.
+# Make *sure* that 'preprocess' comes before any realm if you 
+# need to setup hints for the remote radius server
+authorize {
+       preprocess
+#      counter
+#      attr_filter
+       suffix
+       files
+}
+
+
+# Decide whether the supplied auth info is sufficient for access.
 authenticate {
-# Uncomment this if you want to use PAM (Auth-Type = PAM)
 #      pam
        unix
 # By grouping modules together in an authtype block, that authtype will be
@@ -681,23 +627,9 @@ authenticate {
 #              sql
 #              sql2
 #      }
-# Uncomment this if you want to use ldap (Auth-Type = LDAP)
 #      ldap
 }
 
-# Authorization. First preprocess (hints and huntgroups files),
-# then realms, and finally look in the "users" file.
-# The order of the realm modules will determine the order that
-# we try to find a matching realm.
-# Make *sure* that 'preprocess' comes before any realm if you 
-# need to setup hints for the remote radius server
-authorize {
-       preprocess
-       #counter
-       #attr_filter
-       suffix
-       files
-}
 
 # Pre-accounting. Look for proxy realm in order of realms, then 
 # acct_users file, then preprocess (hints file).
@@ -707,17 +639,19 @@ preacct {
        preprocess
 }
 
+
 # Accounting. Log to detail file, and to the radwtmp file, and maintain
 # radutmp.
 accounting {
-       #acct_unique
+#      acct_unique
        detail
-       #counter
+#      counter
        unix
        radutmp
-       #sradutmp
+#      sradutmp
 }
 
+
 # Session database, used for checking Simultaneous-Use. The radutmp module
 # handles this
 session {
diff --git a/src/modules/rlm_attr_rewrite/Makefile.in b/src/modules/rlm_attr_rewrite/Makefile.in
new file mode 100644 (file)
index 0000000..8f4f4f1
--- /dev/null
@@ -0,0 +1,12 @@
+TARGET      = @targetname@
+SRCS        = rlm_attr_rewrite.c
+HEADERS     = 
+RLM_CFLAGS  = @attr_rewrite_cflags@
+RLM_LIBS    = @attr_rewrite_ldflags@
+RLM_INSTALL = 
+
+include ../rules.mak
+
+$(STATIC_OBJS): $(HEADERS)
+
+$(DYNAMIC_OBJS): $(HEADERS)
diff --git a/src/modules/rlm_attr_rewrite/config.h.in b/src/modules/rlm_attr_rewrite/config.h.in
new file mode 100644 (file)
index 0000000..059d820
--- /dev/null
@@ -0,0 +1,4 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define if you have the <regex.h> header file.  */
+#undef HAVE_REGEX_H
diff --git a/src/modules/rlm_attr_rewrite/configure b/src/modules/rlm_attr_rewrite/configure
new file mode 100755 (executable)
index 0000000..0ba05db
--- /dev/null
@@ -0,0 +1,1248 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+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'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+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
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # 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 ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build="$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" ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) 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)
+    # 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 << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [same as prefix]
+  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+  --datadir=DIR           read-only architecture-independent data in DIR
+                          [PREFIX/share]
+  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+                          [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+  --includedir=DIR        C header files in DIR [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+  --infodir=DIR           info documentation in DIR [PREFIX/info]
+  --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
+EOF
+    cat << EOF
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+EOF
+    if test -n "$ac_help"; then
+      echo "--enable and --with options recognized:$ac_help"
+    fi
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$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)
+    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 ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.13"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    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 "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *)
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set.  These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+
+# 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
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=rlm_attr_rewrite.c
+
+# 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_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  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 "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# 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 "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='       '
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+# From configure.in Revision
+
+
+if test x$with_rlm_attr_rewrite != xno; then
+
+       # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:533: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+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 $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:563: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_prog_rejected=no
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+        ac_prog_rejected=yes
+       continue
+      fi
+      ac_cv_prog_CC="cc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# -gt 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
+    set dummy "$ac_dir/$ac_word" "$@"
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:614: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+ ;;
+    esac
+  fi
+  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:646: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 657 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:662: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cc_works=yes
+  # If we can't run a trivial program, we are probably using a cross compiler.
+  if (./conftest; exit) 2>/dev/null; then
+    ac_cv_prog_cc_cross=no
+  else
+    ac_cv_prog_cc_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:688: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:693: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:702: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:721: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_cc_g=yes
+else
+  ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&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 $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:753: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 768 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:774: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 785 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:791: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 802 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:808: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+
+       ## We may need more complex checking here.  Assume for now that 
+       ## everyone has it.
+       for ac_hdr in regex.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:839: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 844 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:849: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+       targetname=rlm_attr_rewrite
+else
+       targetname=
+       echo \*\*\* module rlm_attr_rewrite is disabled.
+fi
+
+if test x"$fail" != x""; then
+       if test x"${enable_strict_dependencies}" = x"yes"; then
+               { echo "configure: error: set --without-rlm_attr_rewrite to disable it explicitly." 1>&2; exit 1; }
+       else
+               echo "configure: warning: silently not building rlm_attr_rewrite." 1>&2
+               echo "configure: warning: FAILURE: rlm_attr_rewrite requires: $fail." 1>&2; 
+               targetname=""
+       fi
+fi
+
+
+
+
+
+  # delete if you don't want a config.h file.
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# 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.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# 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 \
+      -e "s/'/'\\\\''/g" \
+      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+    ;;
+  *)
+    # `set' quotes correctly as required by POSIX, so do not add quotes.
+    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    ;;
+  esac >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.13"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -fr `echo "Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@attr_rewrite_cflags@%$attr_rewrite_cflags%g
+s%@attr_rewrite_ldflags@%$attr_rewrite_ldflags%g
+s%@targetname@%$targetname%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# 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_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # 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" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# 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='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_uB='\([     ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+  CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h.  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.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# 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.vals <<\EOF
+s%^[   ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+  ac_lines=`grep -c . conftest.vals`
+  # grep -c gives empty output for an empty file on some AIX systems.
+  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+  # Write a limited-size here document to conftest.frag.
+  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  echo 'CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    # Remove last slash and all that follows it.  Not all systems have dirname.
+      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+      # The file is in a subdirectory.
+      test ! -d "$ac_dir" && mkdir "$ac_dir"
+    fi
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/src/modules/rlm_attr_rewrite/configure.in b/src/modules/rlm_attr_rewrite/configure.in
new file mode 100644 (file)
index 0000000..37eaca8
--- /dev/null
@@ -0,0 +1,38 @@
+AC_INIT(rlm_attr_rewrite.c)
+AC_REVISION($Revision$)
+AC_DEFUN(modname,[rlm_attr_rewrite])
+
+if test x$with_[]modname != xno; then
+
+       AC_PROG_CC
+       AC_PROG_CPP
+
+       ## We may need more complex checking here.  Assume for now that 
+       ## everyone has it.
+       AC_CHECK_HEADERS(regex.h)
+
+       targetname=modname
+else
+       targetname=
+       echo \*\*\* module modname is disabled.
+fi
+
+dnl  Don't change this section.
+if test x"$fail" != x""; then
+       if test x"${enable_strict_dependencies}" = x"yes"; then
+               AC_MSG_ERROR([set --without-]modname[ to disable it explicitly.])
+       else
+               AC_MSG_WARN([silently not building ]modname[.])
+               AC_MSG_WARN([FAILURE: ]modname[ requires: $fail.]); 
+               targetname=""
+       fi
+fi
+
+
+AC_SUBST(attr_rewrite_cflags)
+AC_SUBST(attr_rewrite_ldflags)
+
+AC_CONFIG_HEADER(config.h)  # delete if you don't want a config.h file.
+
+AC_SUBST(targetname)
+AC_OUTPUT(Makefile)
diff --git a/src/modules/rlm_attr_rewrite/rlm_attr_rewrite.c b/src/modules/rlm_attr_rewrite/rlm_attr_rewrite.c
new file mode 100644 (file)
index 0000000..30013e9
--- /dev/null
@@ -0,0 +1,314 @@
+/*
+ * rlm_attr_rewrite.c
+ *
+ * Version:  $Id$
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Copyright 2001  The FreeRADIUS server project
+ * Copyright 2001  Kostas Kalevras <kkalev@noc.ntua.gr>
+ */
+
+#include "config.h"
+#include "autoconf.h"
+#include "libradius.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "config.h"
+#if HAVE_REGEX_H
+#      include <regex.h>
+#endif
+
+#include "radiusd.h"
+#include "modules.h"
+#include "conffile.h"
+
+#define RLM_REGEX_INPACKET 0
+#define RLM_REGEX_INCONFIG 1
+#define RLM_REGEX_INREPLY  2
+
+static const char rcsid[] = "$Id$";
+
+typedef struct rlm_attr_rewrite_t {
+       char *attribute;        /* The attribute to search for */
+       int  attr_num;          /* The attribute number */
+       char *search;           /* The pattern to search for */
+       char *searchin_str;     /* The VALUE_PAIR list to search in. Can be either packet,reply or config */
+       char searchin;          /* The same as above just coded as a number for speed */
+       char *replace;          /* The replacement */
+       int  replace_len;       /* The replacement length */
+       int  nocase;            /* Ignore case */
+       int  num_matches;       /* Maximum number of matches */
+} rlm_attr_rewrite_t;
+
+
+static CONF_PARSER module_config[] = {
+  { "attribute", PW_TYPE_STRING_PTR, offsetof(rlm_attr_rewrite_t,attribute), NULL, NULL },
+  { "searchfor", PW_TYPE_STRING_PTR, offsetof(rlm_attr_rewrite_t,search), NULL, NULL },
+  { "searchin",  PW_TYPE_STRING_PTR, offsetof(rlm_attr_rewrite_t,searchin_str), NULL, "packet" },
+  { "replacewith", PW_TYPE_STRING_PTR, offsetof(rlm_attr_rewrite_t,replace), NULL, NULL },
+  { "ignore_case", PW_TYPE_BOOLEAN, offsetof(rlm_attr_rewrite_t,nocase), NULL, "1" },
+  { "max_matches", PW_TYPE_INTEGER, offsetof(rlm_attr_rewrite_t,num_matches), NULL, "10" },
+  { NULL, -1, 0, NULL, NULL }
+};
+
+
+static int attr_rewrite_instantiate(CONF_SECTION *conf, void **instance)
+{
+       rlm_attr_rewrite_t *data;
+       DICT_ATTR *dattr;
+       
+       /*
+        *      Set up a storage area for instance data
+        */
+       data = rad_malloc(sizeof(*data));
+
+       /*
+        *      If the configuration parameters can't be parsed, then
+        *      fail.
+        */
+       if (cf_section_parse(conf, data, module_config) < 0) {
+               free(data);
+               return -1;
+       }
+
+       /*
+        *      Discover the attribute number of the key. 
+        */
+       if (data->attribute == NULL) {
+               radlog(L_ERR, "rlm_attr_rewrite: 'attribute' must be set.");
+               return -1;
+       }
+       if (data->search == NULL || data->replace == NULL) {
+               radlog(L_ERR, "rlm_attr_rewrite: search/replace strings must be set.");
+               return -1;
+       }
+       data->replace_len = strlen(data->replace);
+
+       if (data->num_matches < 1 || data->num_matches > MAX_STRING_LEN) {
+               radlog(L_ERR, "rlm_attr_rewrite: Illegal range for match number.");
+               return -1;
+       }
+       if (data->searchin_str == NULL) {
+               radlog(L_ERR, "rlm_attr_rewrite: Illegal searchin directive given. Assuming packet.");
+               data->searchin = RLM_REGEX_INPACKET;
+       }
+       else{
+               if (strcmp(data->searchin_str, "packet") == 0)
+                       data->searchin = RLM_REGEX_INPACKET;
+               else if (strcmp(data->searchin_str, "config") == 0)
+                       data->searchin = RLM_REGEX_INCONFIG;
+               else if (strcmp(data->searchin_str, "reply") == 0)
+                       data->searchin = RLM_REGEX_INREPLY;
+               else {
+                       radlog(L_ERR, "rlm_attr_rewrite: Illegal searchin directive given. Assuming packet.");
+                       data->searchin = RLM_REGEX_INPACKET;
+               }
+               free((char *)data->searchin_str);
+       }
+       dattr = dict_attrbyname(data->attribute);
+       if (dattr == NULL) {
+               radlog(L_ERR, "rlm_attr_rewrite: No such attribute %s",
+                               data->attribute);
+               return -1;
+       }
+       data->attr_num = dattr->attr;
+       
+       *instance = data;
+       
+       return 0;
+}
+
+static int do_attr_rewrite(void *instance, REQUEST *request)
+{
+       rlm_attr_rewrite_t *data = (rlm_attr_rewrite_t *) instance;
+       int ret = RLM_MODULE_NOOP;
+       VALUE_PAIR *attr_vp = NULL;
+       regex_t preg;
+       regmatch_t pmatch;
+       int cflags = 0;
+       int err = 0;
+       unsigned int len = 0;
+       char err_msg[MAX_STRING_LEN];
+       register unsigned int i = 0;
+       register unsigned int counter = 0;
+       char new_str[MAX_STRING_LEN];
+       char *ptr, *ptr2;
+
+       switch (data->searchin) {
+               case RLM_REGEX_INPACKET:
+                       if (data->attr_num == PW_USER_NAME)
+                               attr_vp = request->username;
+                       else if (data->attr_num == PW_PASSWORD)
+                               attr_vp = request->password;
+                       else
+                               attr_vp = pairfind(request->packet->vps, data->attr_num);
+                       break;
+               case RLM_REGEX_INCONFIG:
+                       attr_vp = pairfind(request->config_items, data->attr_num);
+                       break;
+               case RLM_REGEX_INREPLY:
+                       attr_vp = pairfind(request->reply->vps, data->attr_num);
+                       break;
+               default:
+                       radlog(L_ERR, "rlm_attr_rewrite: Illegal value for searchin. Changing to packet.");
+                       data->searchin = RLM_REGEX_INPACKET;
+                       attr_vp = pairfind(request->packet->vps, data->attr_num);
+                       break;
+       }
+       if (attr_vp == NULL) {
+               DEBUG2("rlm_attr_rewrite: Could not find value pair for attribute %s",data->attribute);
+               return ret;
+       }
+       if (attr_vp->strvalue == NULL || attr_vp->length == 0){
+               DEBUG2("rlm_attr_rewrite: Attribute %s string value NULL or of zero length",data->attribute);
+               return ret;
+       }
+       cflags |= REG_EXTENDED;
+       if (data->nocase)
+               cflags |= REG_ICASE;
+
+       if ((err = regcomp(&preg,data->search,cflags))) {
+               regerror(err, &preg, err_msg, MAX_STRING_LEN);
+               DEBUG2("rlm_attr_rewrite: regcomp() returned error: %s",err_msg);
+               return ret;
+       }
+       ptr = new_str;
+       ptr2 = attr_vp->strvalue;
+       counter = 0;
+
+       for ( /**/ ;i < data->num_matches; i++) {
+               err = regexec(&preg, ptr2, 1, &pmatch, 0);
+               if (err == REG_NOMATCH) {
+                       if (i == 0) {
+                               DEBUG2("rlm_attr_rewrite: No match found for attribute %s with value %s",
+                                               data->attribute, attr_vp->strvalue);
+                               regfree(&preg);
+                               return RLM_MODULE_OK;
+                       } else
+                               break;
+               }
+               if (err != 0) {
+                       regfree(&preg);
+                       radlog(L_ERR, "rlm_attr_rewrite: match failure for attribute %s with value %s",
+                                       data->attribute, attr_vp->strvalue);
+                       return ret;
+               }
+               if (pmatch.rm_so == -1)
+                       break;
+               len = pmatch.rm_so;
+               counter += len;
+               if (counter >= MAX_STRING_LEN) {
+                       regfree(&preg);
+                       DEBUG2("rlm_attr_rewrite: Replacement out of limits for attribute %s with value %s",
+                                       data->attribute, attr_vp->strvalue);    
+                       return ret;
+               }
+
+               strncpy(ptr, ptr2,len);
+               ptr += len;
+               ptr2 += pmatch.rm_eo;
+
+               counter += data->replace_len;
+               if (counter >= MAX_STRING_LEN) {
+                       regfree(&preg);
+                       DEBUG2("rlm_attr_rewrite: Replacement out of limits for attribute %s with value %s",
+                                       data->attribute, attr_vp->strvalue);    
+                       return ret;
+               }
+               strncpy(ptr, data->replace, data->replace_len);
+               ptr += data->replace_len;       
+       }
+       regfree(&preg);
+       len = strlen(ptr2) + 1;         /* We add the ending NULL */
+       counter += len;
+       if (counter >= MAX_STRING_LEN){
+               DEBUG2("rlm_attr_rewrite: Replacement out of limits for attribute %s with value %s",
+                               data->attribute, attr_vp->strvalue);    
+               return ret;
+       }
+       strncpy(ptr, ptr2, len);
+
+       DEBUG2("rlm_attr_rewrite: Changed value for attribute %s from %s to %s",
+                       data->attribute, attr_vp->strvalue, new_str);
+       attr_vp->length = strlen(new_str);
+       strncpy(attr_vp->strvalue, new_str, (attr_vp->length + 1));
+
+       ret = RLM_MODULE_OK;
+
+       return ret;
+}
+
+
+static int attr_rewrite_accounting(void *instance, REQUEST *request)
+{
+       return do_attr_rewrite(instance, request);
+}
+
+static int attr_rewrite_authorize(void *instance, REQUEST *request)
+{
+       return do_attr_rewrite(instance, request);
+}
+static int attr_rewrite_authenticate(void *instance, REQUEST *request)
+{
+       return do_attr_rewrite(instance, request);
+}
+static int attr_rewrite_preacct(void *instance, REQUEST *request)
+{
+       return do_attr_rewrite(instance, request);
+}
+static int attr_rewrite_ismul(void *instance, REQUEST *request)
+{
+       return do_attr_rewrite(instance, request);
+}
+
+static int attr_rewrite_detach(void *instance)
+{
+       rlm_attr_rewrite_t *data = (rlm_attr_rewrite_t *) instance;
+
+       free(data->attribute);
+       free(data->search);
+       free(data->replace);
+
+       free(instance);
+       return 0;
+}
+
+/*
+ *     The module name should be the only globally exported symbol.
+ *     That is, everything else should be 'static'.
+ *
+ *     If the module needs to temporarily modify it's instantiation
+ *     data, the type should be changed to RLM_TYPE_THREAD_UNSAFE.
+ *     The server will then take care of ensuring that the module
+ *     is single-threaded.
+ */
+module_t rlm_attr_rewrite = {
+       "attr_rewrite", 
+       RLM_TYPE_THREAD_UNSAFE,         /* type */
+       NULL,                           /* initialization */
+       attr_rewrite_instantiate,               /* instantiation */
+       {
+               attr_rewrite_authenticate,      /* authentication */
+               attr_rewrite_authorize,         /* authorization */
+               attr_rewrite_preacct,           /* preaccounting */
+               attr_rewrite_accounting,        /* accounting */
+               attr_rewrite_ismul              /* checksimul */
+       },
+       attr_rewrite_detach,                    /* detach */
+       NULL,                           /* destroy */
+};