Skip to content

Commit

Permalink
Cleanup print_abinary
Browse files Browse the repository at this point in the history
  • Loading branch information
arr2036 committed Apr 26, 2014
1 parent d2930d3 commit b5f1474
Show file tree
Hide file tree
Showing 3 changed files with 158 additions and 158 deletions.
2 changes: 1 addition & 1 deletion src/include/libradius.h
Expand Up @@ -727,7 +727,7 @@ void fr_talloc_verify_cb(const void *ptr, int depth,
#ifdef WITH_ASCEND_BINARY
/* filters.c */
int ascend_parse_filter(VALUE_PAIR *vp, char const *value);
void print_abinary(VALUE_PAIR const *vp, char *buffer, size_t len, int8_t quote);
void print_abinary(char *out, size_t outlen, VALUE_PAIR const *vp, int8_t quote);
#endif /*WITH_ASCEND_BINARY*/

/* random numbers in isaac.c */
Expand Down
309 changes: 154 additions & 155 deletions src/lib/filters.c
Expand Up @@ -1119,177 +1119,176 @@ int ascend_parse_filter(VALUE_PAIR *vp, char const *value)
* Note we don't bother checking 'len' after the snprintf's.
* This function should ONLY be called with a large (~1k) buffer.
*/
void print_abinary(VALUE_PAIR const *vp, char *buffer, size_t len, int8_t quote)
void print_abinary(char *out, size_t outlen, VALUE_PAIR const *vp, int8_t quote)
{
size_t i;
char *p;
ascend_filter_t *filter;

static char const *action[] = {"drop", "forward"};
static char const *direction[] = {"out", "in"};

p = buffer;

/*
* Just for paranoia: wrong size filters get printed as octets
*/
if (vp->length != sizeof(*filter)) {
uint8_t *f = (uint8_t *) &vp->vp_filter;
strcpy(p, "0x");
p += 2;
len -= 2;
for (i = 0; i < vp->length; i++) {
snprintf(p, len, "%02x", f[i]);
p += 2;
len -= 2;
}
return;
}

if (quote > 0) {
*(p++) = (char) quote;
len -= 3; /* account for leading & trailing quotes */
}

filter = (ascend_filter_t *) &(vp->vp_filter);
i = snprintf(p, len, "%s %s %s",
fr_int2str(filterType, filter->type, "??"),
direction[filter->direction & 0x01],
action[filter->forward & 0x01]);

p += i;
len -= i;

/*
* Handle IP filters
*/
if (filter->type == RAD_FILTER_IP) {

if (filter->u.ip.srcip) {
i = snprintf(p, len, " srcip %d.%d.%d.%d/%d",
((uint8_t *) &filter->u.ip.srcip)[0],
((uint8_t *) &filter->u.ip.srcip)[1],
((uint8_t *) &filter->u.ip.srcip)[2],
((uint8_t *) &filter->u.ip.srcip)[3],
filter->u.ip.srcmask);
p += i;
len -= i;
}
size_t i;
char *p;
ascend_filter_t *filter;

if (filter->u.ip.dstip) {
i = snprintf(p, len, " dstip %d.%d.%d.%d/%d",
((uint8_t *) &filter->u.ip.dstip)[0],
((uint8_t *) &filter->u.ip.dstip)[1],
((uint8_t *) &filter->u.ip.dstip)[2],
((uint8_t *) &filter->u.ip.dstip)[3],
filter->u.ip.dstmask);
p += i;
len -= i;
}
static char const *action[] = {"drop", "forward"};
static char const *direction[] = {"out", "in"};

i = snprintf(p, len, " %s",
fr_int2str(filterProtoName, filter->u.ip.proto, "??"));
p += i;
len -= i;

if (filter->u.ip.srcPortComp > RAD_NO_COMPARE) {
i = snprintf(p, len, " srcport %s %d",
fr_int2str(filterCompare, filter->u.ip.srcPortComp, "??"),
ntohs(filter->u.ip.srcport));
p += i;
len -= i;
}
p = out;

if (filter->u.ip.dstPortComp > RAD_NO_COMPARE) {
i = snprintf(p, len, " dstport %s %d",
fr_int2str(filterCompare, filter->u.ip.dstPortComp, "??"),
ntohs(filter->u.ip.dstport));
p += i;
len -= i;
}
/*
* Just for paranoia: wrong size filters get printed as octets
*/
if (vp->length != sizeof(*filter)) {
uint8_t *f = (uint8_t *) &vp->vp_filter;

strcpy(p, "0x");
p += 2;
outlen -= 2;
for (i = 0; i < vp->length; i++) {
snprintf(p, outlen, "%02x", f[i]);
p += 2;
outlen -= 2;
}
return;
}

if (filter->u.ip.established) {
i = snprintf(p, len, " est");
p += i;
}
if (quote > 0) {
*(p++) = (char) quote;
outlen -= 3; /* account for leading & trailing quotes */
}

/*
* Handle IPX filters
*/
} else if (filter->type == RAD_FILTER_IPX) {
/* print for source */
if (filter->u.ipx.src.net) {
i = snprintf(p, len, " srcipxnet 0x%04x srcipxnode 0x%02x%02x%02x%02x%02x%02x",
(unsigned int)ntohl(filter->u.ipx.src.net),
filter->u.ipx.src.node[0], filter->u.ipx.src.node[1],
filter->u.ipx.src.node[2], filter->u.ipx.src.node[3],
filter->u.ipx.src.node[4], filter->u.ipx.src.node[5]);
p += i;
len -= i;

if (filter->u.ipx.srcSocComp > RAD_NO_COMPARE) {
i = snprintf(p, len, " srcipxsock %s 0x%04x",
fr_int2str(filterCompare, filter->u.ipx.srcSocComp, "??"),
ntohs(filter->u.ipx.src.socket));
p += i;
len -= i;
}
}
filter = (ascend_filter_t *) &(vp->vp_filter);
i = snprintf(p, outlen, "%s %s %s", fr_int2str(filterType, filter->type, "??"),
direction[filter->direction & 0x01], action[filter->forward & 0x01]);

/* same for destination */
if (filter->u.ipx.dst.net) {
i = snprintf(p, len, " dstipxnet 0x%04x dstipxnode 0x%02x%02x%02x%02x%02x%02x",
(unsigned int)ntohl(filter->u.ipx.dst.net),
filter->u.ipx.dst.node[0], filter->u.ipx.dst.node[1],
filter->u.ipx.dst.node[2], filter->u.ipx.dst.node[3],
filter->u.ipx.dst.node[4], filter->u.ipx.dst.node[5]);
p += i;
len -= i;

if (filter->u.ipx.dstSocComp > RAD_NO_COMPARE) {
i = snprintf(p, len, " dstipxsock %s 0x%04x",
fr_int2str(filterCompare, filter->u.ipx.dstSocComp, "??"),
ntohs(filter->u.ipx.dst.socket));
p += i;
}
}
outlen -= i;

/*
* Handle IP filters
*/
if (filter->type == RAD_FILTER_IP) {

if (filter->u.ip.srcip) {
i = snprintf(p, outlen, " srcip %d.%d.%d.%d/%d",
((uint8_t *) &filter->u.ip.srcip)[0],
((uint8_t *) &filter->u.ip.srcip)[1],
((uint8_t *) &filter->u.ip.srcip)[2],
((uint8_t *) &filter->u.ip.srcip)[3],
filter->u.ip.srcmask);
p += i;
outlen -= i;
}

if (filter->u.ip.dstip) {
i = snprintf(p, outlen, " dstip %d.%d.%d.%d/%d",
((uint8_t *) &filter->u.ip.dstip)[0],
((uint8_t *) &filter->u.ip.dstip)[1],
((uint8_t *) &filter->u.ip.dstip)[2],
((uint8_t *) &filter->u.ip.dstip)[3],
filter->u.ip.dstmask);
p += i;
outlen -= i;
}

} else if (filter->type == RAD_FILTER_GENERIC) {
int count;
i = snprintf(p, outlen, " %s", fr_int2str(filterProtoName, filter->u.ip.proto, "??"));
p += i;
outlen -= i;

i = snprintf(p, len, " %u ", (unsigned int) ntohs(filter->u.generic.offset));
p += i;
if (filter->u.ip.srcPortComp > RAD_NO_COMPARE) {
i = snprintf(p, outlen, " srcport %s %d",
fr_int2str(filterCompare, filter->u.ip.srcPortComp, "??"),
ntohs(filter->u.ip.srcport));
p += i;
outlen -= i;
}

/* show the mask */
for (count = 0; count < ntohs(filter->u.generic.len); count++) {
i = snprintf(p, len, "%02x", filter->u.generic.mask[count]);
p += i;
len -= i;
}
if (filter->u.ip.dstPortComp > RAD_NO_COMPARE) {
i = snprintf(p, outlen, " dstport %s %d",
fr_int2str(filterCompare, filter->u.ip.dstPortComp, "??"),
ntohs(filter->u.ip.dstport));
p += i;
outlen -= i;
}

strcpy(p, " ");
p++;
len--;
if (filter->u.ip.established) {
i = snprintf(p, outlen, " est");
p += i;
}

/* show the value */
for (count = 0; count < ntohs(filter->u.generic.len); count++) {
i = snprintf(p, len, "%02x", filter->u.generic.value[count]);
p += i;
len -= i;
}
/*
* Handle IPX filters
*/
} else if (filter->type == RAD_FILTER_IPX) {
/* print for source */
if (filter->u.ipx.src.net) {
i = snprintf(p, outlen, " srcipxnet 0x%04x srcipxnode 0x%02x%02x%02x%02x%02x%02x",
(unsigned int)ntohl(filter->u.ipx.src.net),
filter->u.ipx.src.node[0], filter->u.ipx.src.node[1],
filter->u.ipx.src.node[2], filter->u.ipx.src.node[3],
filter->u.ipx.src.node[4], filter->u.ipx.src.node[5]);
p += i;
outlen -= i;

if (filter->u.ipx.srcSocComp > RAD_NO_COMPARE) {
i = snprintf(p, outlen, " srcipxsock %s 0x%04x",
fr_int2str(filterCompare, filter->u.ipx.srcSocComp, "??"),
ntohs(filter->u.ipx.src.socket));
p += i;
outlen -= i;
}
}

i = snprintf(p, len, " %s", (filter->u.generic.compNeq) ? "!=" : "==");
p += i;
len -= i;
/* same for destination */
if (filter->u.ipx.dst.net) {
i = snprintf(p, outlen, " dstipxnet 0x%04x dstipxnode 0x%02x%02x%02x%02x%02x%02x",
(unsigned int)ntohl(filter->u.ipx.dst.net),
filter->u.ipx.dst.node[0], filter->u.ipx.dst.node[1],
filter->u.ipx.dst.node[2], filter->u.ipx.dst.node[3],
filter->u.ipx.dst.node[4], filter->u.ipx.dst.node[5]);
p += i;
outlen -= i;

if (filter->u.ipx.dstSocComp > RAD_NO_COMPARE) {
i = snprintf(p, outlen, " dstipxsock %s 0x%04x",
fr_int2str(filterCompare, filter->u.ipx.dstSocComp, "??"),
ntohs(filter->u.ipx.dst.socket));
p += i;
}
}
} else if (filter->type == RAD_FILTER_GENERIC) {
int count;

if (filter->u.generic.more != 0) {
i = snprintf(p, len, " more");
p += i;
}
}
i = snprintf(p, outlen, " %u ", (unsigned int) ntohs(filter->u.generic.offset));
p += i;

if (quote > 0) *(p++) = (char) quote;
*p = '\0';
/* show the mask */
for (count = 0; count < ntohs(filter->u.generic.len); count++) {
i = snprintf(p, outlen, "%02x", filter->u.generic.mask[count]);
p += i;
outlen -= i;
}

strcpy(p, " ");
p++;
outlen--;

/* show the value */
for (count = 0; count < ntohs(filter->u.generic.len); count++) {
i = snprintf(p, outlen, "%02x", filter->u.generic.value[count]);
p += i;
outlen -= i;
}

i = snprintf(p, outlen, " %s", (filter->u.generic.compNeq) ? "!=" : "==");
p += i;
outlen -= i;

if (filter->u.generic.more != 0) {
i = snprintf(p, outlen, " more");
p += i;
}
}

if (quote > 0) {
*(p++) = (char) quote;
}
*p = '\0';
}

#endif
5 changes: 3 additions & 2 deletions src/lib/print.c
Expand Up @@ -422,7 +422,8 @@ size_t vp_prints_value(char *out, size_t outlen, VALUE_PAIR const *vp, int8_t qu

case PW_TYPE_ABINARY:
#ifdef WITH_ASCEND_BINARY
print_abinary(vp, buf, sizeof(buf), quote);

print_abinary(buf, sizeof(buf), vp, quote);
a = buf;
len = strlen(buf);
break;
Expand Down Expand Up @@ -634,7 +635,7 @@ char *vp_aprint(TALLOC_CTX *ctx, VALUE_PAIR const *vp)
#ifdef WITH_ASCEND_BINARY
p = talloc_array(ctx, char, 128);
if (!p) return NULL;
print_abinary(vp, p, 128, 0);
print_abinary(p, 128, vp, 0);
break;
#else
/* FALL THROUGH */
Expand Down

0 comments on commit b5f1474

Please sign in to comment.