#include <freeradius-devel/ident.h>
RCSID("$Id$")
-#include <freeradius-devel/autoconf.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
#include <freeradius-devel/radiusd.h>
-
#include <freeradius-devel/rad_assert.h>
+#include <ctype.h>
+
typedef struct xlat_t {
char module[MAX_STRING_LEN];
int length;
/*
* %{Attribute-Name[*]} returns ALL of the
* the attributes, separated by a newline.
- */
+ */
if ((p[1] == '*') && (p[2] == ']')) {
int total = 0;
total += count + 1;
outlen -= (count + 1);
out += count;
-
+
*(out++) = '\n';
if (outlen == 0) break;
return total;
}
-
+
count = atoi(p + 1);
/*
case PW_PACKET_TYPE:
{
DICT_VALUE *dval;
-
+
dval = dict_valbyattr(da->attr, packet->code);
if (dval) {
snprintf(out, outlen, "%s", dval->name);
return 0;
}
localvp.attribute = da->attr;
- localvp.lvalue = packet->src_ipaddr.ipaddr.ip4addr.s_addr;
+ localvp.vp_ipaddr = packet->src_ipaddr.ipaddr.ip4addr.s_addr;
break;
-
+
case PW_PACKET_DST_IP_ADDRESS:
if (packet->dst_ipaddr.af != AF_INET) {
return 0;
}
localvp.attribute = da->attr;
- localvp.lvalue = packet->dst_ipaddr.ipaddr.ip4addr.s_addr;
+ localvp.vp_ipaddr = packet->dst_ipaddr.ipaddr.ip4addr.s_addr;
break;
-
+
case PW_PACKET_SRC_PORT:
localvp.attribute = da->attr;
- localvp.lvalue = packet->src_port;
+ localvp.vp_integer = packet->src_port;
break;
-
+
case PW_PACKET_DST_PORT:
localvp.attribute = da->attr;
- localvp.lvalue = packet->dst_port;
+ localvp.vp_integer = packet->dst_port;
break;
case PW_PACKET_AUTHENTICATION_VECTOR:
strlcpy(out, "server_core", outlen);
}
return strlen(out);
-
+
case PW_PACKET_SRC_IPV6_ADDRESS:
if (packet->src_ipaddr.af != AF_INET6) {
return 0;
&packet->src_ipaddr.ipaddr.ip6addr,
sizeof(packet->src_ipaddr.ipaddr.ip6addr));
break;
-
+
case PW_PACKET_DST_IPV6_ADDRESS:
if (packet->dst_ipaddr.af != AF_INET6) {
return 0;
&packet->dst_ipaddr.ipaddr.ip6addr,
sizeof(packet->dst_ipaddr.ipaddr.ip6addr));
break;
-
+
case PW_SERVER_IDENTITY:
if (!request->listener || !request->listener->identity) return 0;
snprintf(out, outlen, "%s", request->listener->identity);
return strlen(out);
break;
-
+
default:
return 0; /* not found */
break;
*/
fmt = fmt; /* -Wunused */
func = func; /* -Wunused FIXME: do escaping? */
-
+
regex = request_data_reference(request, request,
REQUEST_DATA_REGEX | *(int *)instance);
if (!regex) return 0;
}
#endif /* HAVE_REGEX_H */
+
/*
* Compare two xlat_t structs, based ONLY on the module name.
*/
* Decode an attribute name into a string.
*/
static void decode_attribute(const char **from, char **to, int freespace,
- int *open, REQUEST *request,
+ int *open_p, REQUEST *request,
RADIUS_ESCAPE_STRING func)
{
int do_length = 0;
const char *p;
char *q, *pa;
int found=0, retlen=0;
- int openbraces = *open;
+ int openbraces = *open_p;
const xlat_t *c;
+ int spaces = FALSE;
p = *from;
q = *to;
*/
} else if (*p == '}') {
openbraces--;
- rad_assert(openbraces == *open);
+ rad_assert(openbraces == *open_p);
p++;
xlat_string = xlat_name;
p += 2;
xlat_string = xlat_name;
goto do_xlat;
-
+
} else { /* module name, followed by per-module string */
int stop = 0;
- int delimitbrace = *open;
+ int delimitbrace = *open_p;
rad_assert(*p == ':');
p++; /* skip the ':' */
openbraces++;
p++;
}
-
+
xlat_string = rad_malloc(strlen(p) + 1); /* always returns */
free_xlat_string = TRUE;
pa = xlat_string;
-
+
/*
* Copy over the rest of the string, which is per-module
* data.
*/
while (*p && !stop) {
switch(*p) {
+
/*
* What the heck is this supposed
* to be doing?
*pa++ = *p++;
break;
+ case ':':
+ if (!spaces && p[1] == '-') {
+ p += 2;
+ stop = 1;
+ break;
+ }
+
/*
* This is pretty hokey... we
* should use the functions in
*pa++ = *p++;
}
break;
-
+
+ case ' ':
+ case '\t':
+ spaces = TRUE;
+ /* FALL-THROUGH */
+
default:
*pa++ = *p++;
break;
p += 2;
}
}
-
+
/*
* Look up almost everything in the new tree of xlat
* functions. This makes it a little quicker...
q += retlen;
- while((*p != '\0') && (openbraces > *open)) {
+ while((*p != '\0') && (openbraces > *open_p)) {
/*
* Handle escapes outside of the loop.
*/
p++; /* skip the character */
}
}
-
+
done:
if (free_xlat_string) free(xlat_string);
- *open = openbraces;
+ *open_p = openbraces;
*from = p;
*to = q;
}
break;
case 'l': /* request timestamp */
snprintf(tmpdt, sizeof(tmpdt), "%lu",
- (unsigned long) request->timestamp);
+ (unsigned long) request->received.tv_sec);
strlcpy(q,tmpdt,freespace);
q += strlen(q);
p++;
p++;
break;
case 'A': /* radacct_dir */
- strlcpy(q,radacct_dir,freespace-1);
+ strlcpy(q,radacct_dir,freespace);
q += strlen(q);
p++;
break;
case 'C': /* ClientName */
- strlcpy(q,client_name_old(&request->packet->src_ipaddr),freespace-1);
+ strlcpy(q,client_name_old(&request->packet->src_ipaddr),freespace);
q += strlen(q);
p++;
break;
p++;
break;
case 'L': /* radlog_dir */
- strlcpy(q,radlog_dir,freespace-1);
+ strlcpy(q,radlog_dir,freespace);
q += strlen(q);
p++;
break;
p++;
break;
case 'R': /* radius_dir */
- strlcpy(q,radius_dir,freespace-1);
+ strlcpy(q,radius_dir,freespace);
q += strlen(q);
p++;
break;
p++;
break;
case 'V': /* Request-Authenticator */
- if (request->packet->verified)
- strlcpy(q,"Verified",freespace-1);
- else
- strlcpy(q,"None",freespace-1);
+ strlcpy(q,"Verified",freespace);
q += strlen(q);
p++;
break;