From e07b87d38abcb5fa4d3a23b1a7f924510cc72313 Mon Sep 17 00:00:00 2001 From: "Alan T. DeKok" Date: Thu, 16 May 2013 09:31:56 -0400 Subject: [PATCH] Tests for xlat output --- src/include/parser.h | 1 + src/main/radattr.c | 4 +- src/main/xlat.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/tests/xlat.txt | 55 ++++++++++++------------- 4 files changed, 143 insertions(+), 29 deletions(-) diff --git a/src/include/parser.h b/src/include/parser.h index 006fd3d..9ee29a6 100644 --- a/src/include/parser.h +++ b/src/include/parser.h @@ -88,6 +88,7 @@ size_t fr_cond_sprint(char *buffer, size_t bufsize, fr_cond_t const *c); typedef struct xlat_exp xlat_exp_t; ssize_t xlat_tokenize(TALLOC_CTX *ctx, char *fmt, xlat_exp_t **head, char const **error); +size_t xlat_sprint(char *buffer, size_t bufsize, xlat_exp_t const *node); #ifdef __cplusplus } diff --git a/src/main/radattr.c b/src/main/radattr.c index 26e4192..2d2fe28 100644 --- a/src/main/radattr.c +++ b/src/main/radattr.c @@ -552,7 +552,6 @@ static void parse_xlat(char const *input, char *output, size_t outlen) xlat_exp_t *head; slen = xlat_tokenize(fmt, fmt, &head, &error); - talloc_free(fmt); if (slen <= 0) { snprintf(output, outlen, "ERROR offset %d '%s'", (int) -slen, error); return; @@ -563,7 +562,8 @@ static void parse_xlat(char const *input, char *output, size_t outlen) return; } - strlcpy(output, "OK", outlen); + xlat_sprint(output, outlen, head); + talloc_free(fmt); } static void process_file(char const *filename) diff --git a/src/main/xlat.c b/src/main/xlat.c index fc768a4..fd0814f 100644 --- a/src/main/xlat.c +++ b/src/main/xlat.c @@ -1121,6 +1121,118 @@ static void xlat_tokenize_debug(xlat_exp_t const *node, int lvl) } } +size_t xlat_sprint(char *buffer, size_t bufsize, xlat_exp_t const *node) +{ + size_t len; + char *p, *end; + + if (!node) { + *buffer = '\0'; + return 0; + } + + p = buffer; + end = buffer + bufsize; + + while (node) { + switch (node->type) { + case XLAT_LITERAL: + case XLAT_PERCENT: + strlcpy(p, node->fmt, end - p); + p += strlen(p); + break; + + case XLAT_ATTRIBUTE: + *(p++) = '%'; + *(p++) = '{'; + + if (node->ref != REQUEST_CURRENT) { + strlcpy(p, fr_int2str(request_refs, node->ref, "??"), end - p); + p += strlen(p); + *(p++) = '.'; + } + + if ((node->ref != REQUEST_CURRENT) || + (node->list != PAIR_LIST_REQUEST)) { + strlcpy(p, fr_int2str(pair_lists, node->list, "??"), end - p); + p += strlen(p); + *(p++) = ':'; + } + + strlcpy(p, node->da->name, end - p); + p += strlen(p); + + if (node->tag != TAG_ANY) { + *(p++) = ':'; + snprintf(p, end - p, "%u", node->tag); + p += strlen(p); + } + + if (node->num != 0) { + *(p++) = '['; + + if (node->num == 65536) { + *(p++) = '#'; + + } else if (node->num == 65537) { + *(p++) = '*'; + + } else { + snprintf(p, end - p, "%u", node->num); + p += strlen(p); + } + *(p++) = ']'; + } + *(p++) = '}'; + break; + + case XLAT_REGEX: + snprintf(p, end - p, "%%{%u}", node->num); + p += strlen(p); + break; + + case XLAT_MODULE: + *(p++) = '%'; + *(p++) = '{'; + strlcpy(p, node->xlat->name, end - p); + p += strlen(p); + *(p++) = ':'; + + if (node->child) { + len = xlat_sprint(p, end - p, node->child); + p += len; + } + *(p++) = '}'; + break; + + case XLAT_ALTERNATE: + *(p++) = '%'; + *(p++) = '{'; + + len = xlat_sprint(p, end - p, node->child); + p += len; + + *(p++) = ':'; + *(p++) = '-'; + + len = xlat_sprint(p, end - p, node->alternate); + p += len; + + *(p++) = '}'; + break; + } + + if (p == end) break; + + node = node->next; + } + + *p = '\0'; + + return p - buffer; +} + + static char const xlat_spaces[] = " "; diff --git a/src/tests/xlat.txt b/src/tests/xlat.txt index 6aa0a88..bb82bda 100644 --- a/src/tests/xlat.txt +++ b/src/tests/xlat.txt @@ -6,10 +6,10 @@ xlat %{foo: bar} data ERROR offset 2 'Unknown module' xlat %{test:bar} -data OK +data %{test:bar} xlat %{1} -data OK +data %{1} xlat %{9} data ERROR offset 2 'Invalid regex reference' @@ -24,79 +24,79 @@ xlat %{%{User-Name}:-%{bar}} data ERROR offset 18 'Unknown attribute' xlat %{%{User-Name}:-bar} -data OK +data %{%{User-Name}:-bar} xlat %{%{test:bar}:-%{User-Name}} -data OK +data %{%{test:bar}:-%{User-Name}} xlat %{%{test:bar}:-%{%{User-Name}:-bar}} -data OK +data %{%{test:bar}:-%{%{User-Name}:-bar}} xlat %{Tunnel-Password} -data OK +data %{Tunnel-Password} xlat %{Tunnel-Password:1} -data OK +data %{Tunnel-Password:1} xlat %{Tunnel-Password:1[3]} -data OK +data %{Tunnel-Password:1[3]} xlat %{Tunnel-Password:1[*]} -data OK +data %{Tunnel-Password:1[*]} xlat %{Tunnel-Password:1[#]} -data OK +data %{Tunnel-Password:1[#]} xlat %{reply:Tunnel-Password} -data OK +data %{reply:Tunnel-Password} xlat %{reply:Tunnel-Password:1} -data OK +data %{reply:Tunnel-Password:1} xlat %{reply:Tunnel-Password:1[3]} -data OK +data %{reply:Tunnel-Password:1[3]} xlat %{reply:Tunnel-Password:1[*]} -data OK +data %{reply:Tunnel-Password:1[*]} xlat %{reply:Tunnel-Password:1[#]} -data OK +data %{reply:Tunnel-Password:1[#]} xlat %{User-Name[3]} -data OK +data %{User-Name[3]} xlat %{User-Name[*]} -data OK +data %{User-Name[*]} xlat %{User-Name[#]} -data OK +data %{User-Name[#]} xlat %{request:User-Name[3]} -data OK +data %{User-Name[3]} xlat %{request:User-Name[*]} -data OK +data %{User-Name[*]} xlat %{request:User-Name[#]} -data OK +data %{User-Name[#]} xlat %{coa:User-Name[#]} -data OK +data %{coa:User-Name[#]} xlat %{coaX:User-Name[#]} data ERROR offset 2 'Unknown module' xlat %{3GPP-SGSN-Address} -data OK +data %{3GPP-SGSN-Address} xlat %{%{Operator-Name}:-} -data OK +data %{%{Operator-Name}:-} xlat %{%{}:-} -data ERROR offset 4 'Empty expansion is invalid' +data ERROR offset 4 'Empty expression is invalid' xlat %{%{}:-foo} -data ERROR offset 4 'Empty expansion is invalid' +data ERROR offset 4 'Empty expression is invalid' xlat %{} data ERROR offset 2 'Empty expression is invalid' @@ -104,4 +104,5 @@ data ERROR offset 2 'Empty expression is invalid' xlat %{ } data ERROR offset 2 'Unknown attribute' - +xlat %{%{User-Name}:-} +data %{%{User-Name}:-} -- 2.1.4