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:19 +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 bad147d..0c31b19 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 8442325..d1cf877 100644 (file)
@@ -570,9 +570,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) {