Added toupper function
[freeradius.git] / src / main / xlat.c
index cf675df..e53300a 100644 (file)
@@ -179,7 +179,7 @@ static size_t xlat_packet(void *instance, REQUEST *request,
                if (!da) return 0;
 
                if (do_number) {
-                       vp = pairfind(vps, da->attr);
+                       vp = pairfind(vps, da->attr, 0);
                        if (!vp) return 0;
 
                        switch (da->type) {
@@ -204,9 +204,9 @@ static size_t xlat_packet(void *instance, REQUEST *request,
                if ((p[1] == '#') && (p[2] == ']')) {
                        count = 0;
 
-                       for (vp = pairfind(vps, da->attr);
+                       for (vp = pairfind(vps, da->attr, da->vendor);
                             vp != NULL;
-                            vp = pairfind(vp->next, da->attr)) {
+                            vp = pairfind(vp->next, da->attr, da->vendor)) {
                                count++;
                        }
                        snprintf(out, outlen, "%d", (int) count);
@@ -220,9 +220,9 @@ static size_t xlat_packet(void *instance, REQUEST *request,
                if ((p[1] == '*') && (p[2] == ']')) {
                        int total = 0;
 
-                       for (vp = pairfind(vps, da->attr);
+                       for (vp = pairfind(vps, da->attr, da->vendor);
                             vp != NULL;
-                            vp = pairfind(vp->next, da->attr)) {
+                            vp = pairfind(vp->next, da->attr, da->vendor)) {
                                count = valuepair2str(out, outlen - 1, vp, da->type, func);
                                rad_assert(count <= outlen);
                                total += count + 1;
@@ -252,9 +252,9 @@ static size_t xlat_packet(void *instance, REQUEST *request,
                /*
                 *      Find the N'th value.
                 */
-               for (vp = pairfind(vps, da->attr);
+               for (vp = pairfind(vps, da->attr, da->vendor);
                     vp != NULL;
-                    vp = pairfind(vp->next, da->attr)) {
+                    vp = pairfind(vp->next, da->attr, da->vendor)) {
                        if (count == 0) break;
                        count--;
                }
@@ -267,7 +267,7 @@ static size_t xlat_packet(void *instance, REQUEST *request,
                return valuepair2str(out, outlen, vp, da->type, func);
        }
 
-       vp = pairfind(vps, da->attr);
+       vp = pairfind(vps, da->attr, da->vendor);
        if (!vp) {
                /*
                 *      Some "magic" handlers, which are never in VP's, but
@@ -286,7 +286,7 @@ static size_t xlat_packet(void *instance, REQUEST *request,
                        {
                                DICT_VALUE *dval;
 
-                               dval = dict_valbyattr(da->attr, packet->code);
+                               dval = dict_valbyattr(da->attr, da->vendor, packet->code);
                                if (dval) {
                                        snprintf(out, outlen, "%s", dval->name);
                                } else {
@@ -499,6 +499,65 @@ static size_t xlat_md5(UNUSED void *instance, REQUEST *request,
        return strlen(out);
 }
 
+
+/*
+ *     Convert a string to lowercase
+ */
+static size_t xlat_lc(UNUSED void *instance, REQUEST *request,
+                      char *fmt, char *out, size_t outlen,
+                      UNUSED RADIUS_ESCAPE_STRING func)
+{
+       char *p, *q;
+       char buffer[1024];
+
+       if (outlen <= 1) return 0;
+
+       if (!radius_xlat(buffer, sizeof(buffer), fmt, request, func)) {
+               *out = '\0';
+               return 0;
+       }
+
+       for (p = buffer, q = out; *p != '\0'; p++, outlen--) {
+               if (outlen <= 1) break;
+
+               *(q++) = tolower((int) *p);
+       }
+
+       *q = '\0';
+
+       return strlen(out);
+}
+
+
+/*
+ *     Convert a string to uppercase
+ */
+static size_t xlat_uc(UNUSED void *instance, REQUEST *request,
+                      char *fmt, char *out, size_t outlen,
+                      UNUSED RADIUS_ESCAPE_STRING func)
+{
+       char *p, *q;
+       char buffer[1024];
+
+       if (outlen <= 1) return 0;
+
+       if (!radius_xlat(buffer, sizeof(buffer), fmt, request, func)) {
+               *out = '\0';
+               return 0;
+       }
+
+       for (p = buffer, q = out; *p != '\0'; p++, outlen--) {
+               if (outlen <= 1) break;
+
+               *(q++) = toupper((int) *p);
+       }
+
+       *q = '\0';
+
+       return strlen(out);
+}
+
+
 /*
  *     Compare two xlat_t structs, based ONLY on the module name.
  */
@@ -513,7 +572,6 @@ static int xlat_cmp(const void *a, const void *b)
                      ((const xlat_t *)a)->length);
 }
 
-
 /*
  *     find the appropriate registered xlat function.
  */
@@ -610,6 +668,16 @@ int xlat_register(const char *module, RAD_XLAT_FUNC func, void *instance)
                c = xlat_find("md5");
                rad_assert(c != NULL);
                c->internal = TRUE;
+
+               xlat_register("tolower", xlat_lc, &xlat_inst[0]);
+               c = xlat_find("tolower");
+               rad_assert(c != NULL);
+               c->internal = TRUE;
+
+               xlat_register("toupper", xlat_uc, &xlat_inst[0]);
+               c = xlat_find("toupper");
+               rad_assert(c != NULL);
+               c->internal = TRUE;
        }
 
        /*