X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fxlat.c;h=e53300a5b03204f4d363baf614cf7dacb9db4461;hb=6a38db0b72a0913508dbdddca6d87c2fc279bac4;hp=cf675dfe5fc68eb0b28ac5b8852576c77ab89edd;hpb=c43099c9aaea0e6f7e3ab8d0db8f5660725ba862;p=freeradius.git diff --git a/src/main/xlat.c b/src/main/xlat.c index cf675df..e53300a 100644 --- a/src/main/xlat.c +++ b/src/main/xlat.c @@ -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; } /*