]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Expose radius_get_vp, and make switch {} use it
authorAlan T. DeKok <aland@freeradius.org>
Fri, 8 May 2009 13:40:07 +0000 (15:40 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 8 May 2009 13:40:07 +0000 (15:40 +0200)
This allows bare words to be used for switch statements.  If the
statement is a bare word, the server looks for a VALUE_PAIR of that
name, and prints its value.

src/main/evaluate.c
src/main/modcall.c

index bad147d6b9cf50ad03875d40a7ccbe1f9e389ee1..0c31b19404273c1602bf6b8949eee3e8b3b74f43 100644 (file)
@@ -199,8 +199,7 @@ static const FR_NAME_NUMBER modreturn_table[] = {
 };
 
 
-static int radius_get_vp(REQUEST *request, const char *name, VALUE_PAIR **vp_p)
-                       
+int radius_get_vp(REQUEST *request, const char *name, VALUE_PAIR **vp_p)
 {
        const char *vp_name = name;
        REQUEST *myrequest = request;
index 54e80278cab28d6966fb5617fdb2273af8ff7f03..3954c7364aa0999d8d2ee9693bd4adef8c0d53e3 100644 (file)
@@ -569,9 +569,22 @@ int modcall(int component, modcallable *c, REQUEST *request)
 
 #ifdef WITH_UNLANG
                        case MOD_SWITCH:
-                               radius_xlat(buffer, sizeof(buffer),
-                                           child->name, request, NULL);
-
+                               if (!strchr(child->name, '%')) {
+                                       VALUE_PAIR *vp = NULL;
+
+                                       radius_get_vp(request, child->name,
+                                                     &vp);
+                                       if (vp) {
+                                               vp_prints_value(buffer,
+                                                               sizeof(buffer),
+                                                               vp, 0);
+                                       } else {
+                                               *buffer = '\0';
+                                       }
+                               } else {
+                                       radius_xlat(buffer, sizeof(buffer),
+                                                   child->name, request, NULL);
+                               }
                                null_case = q = NULL;
                                for(p = g->children; p; p = p->next) {
                                        if (!p->name) {