Recast more internal string routines to use growable-strings
[exim.git] / src / src / auths / call_radius.c
index 4bbe6d754bc39d281e7a5043b2a1fc79b699a138..c3637436dc168da653ef39cdfa04035b77b75fe6 100644 (file)
@@ -2,12 +2,22 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2009 */
+/* Copyright (c) University of Cambridge 1995 - 2016 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* This file was originally supplied by Ian Kirk. The libradius support came
 from Alex Kiernan. */
 
+/* ugly hack to work around redefinition of ENV by radiusclient.h and
+ * db.h: define _DB_H_ so the db.h include thinks it's already included,
+ * we can get away with it like this, since this file doesn't use any db
+ * functions. */
+#ifndef _DB_H_
+# define _DB_H_ 1
+# define _DB_EXT_PROT_IN_ 1
+# define DB void
+#endif
+
 #include "../exim.h"
 
 /* This module contains functions that call the Radius authentication
@@ -20,10 +30,12 @@ RADIUS_CONFIG_FILE is defined. However, some compilers don't like compiling
 empty modules, so keep them happy with a dummy when skipping the rest. Make it
 reference itself to stop picky compilers complaining that it is unused, and put
 in a dummy argument to stop even pickier compilers complaining about infinite
-loops. */
+loops. Then use a mutually-recursive pair as gcc is just getting stupid. */
 
 #ifndef RADIUS_CONFIG_FILE
-static void dummy(int x) { dummy(x-1); }
+static void dummy(int x);
+static void dummy2(int x) { dummy(x-1); }
+static void dummy(int x) { dummy2(x-1); }
 #else  /* RADIUS_CONFIG_FILE */
 
 
@@ -34,9 +46,14 @@ using its original API. At release 0.4.0 the API changed. */
   #include <radlib.h>
 #else
   #if !defined(RADIUS_LIB_RADIUSCLIENT) && !defined(RADIUS_LIB_RADIUSCLIENTNEW)
-  #define RADIUS_LIB_RADIUSCLIENT
+  # define RADIUS_LIB_RADIUSCLIENT
+  #endif
+
+  #ifdef RADIUS_LIB_RADIUSCLIENTNEW
+  # include <freeradius-client.h>
+  #else
+  # include <radiusclient.h>
   #endif
-  #include <radiusclient.h>
 #endif
 
 
@@ -58,10 +75,10 @@ Returns:   OK if authentication succeeded
 */
 
 int
-auth_call_radius(uschar *s, uschar **errptr)
+auth_call_radius(const uschar *s, uschar **errptr)
 {
 uschar *user;
-uschar *radius_args = s;
+const uschar *radius_args = s;
 int result;
 int sep = 0;
 
@@ -148,6 +165,7 @@ switch (result)
   case OK_RC:
   return OK;
 
+  case REJECT_RC:
   case ERROR_RC:
   return FAIL;