Skip to content

Commit

Permalink
Revert "pass fr_dict_attr_t to fr_value_box_to_network()"
Browse files Browse the repository at this point in the history
This reverts commit e2be98d.

set dst->enumv in from_network().  And then use it in to_network()
and the same for to_str and from_str
  • Loading branch information
alandekok committed Aug 20, 2019
1 parent 840b29a commit 8c739f3
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/lib/sim/encode.c
Expand Up @@ -570,7 +570,7 @@ static ssize_t encode_value(uint8_t *out, size_t outlen,
case FR_TYPE_UINT32:
case FR_TYPE_UINT64:
case FR_TYPE_INT32:
len = fr_value_box_to_network(NULL, out, outlen, &vp->data, vp->da);
len = fr_value_box_to_network(NULL, out, outlen, &vp->data);
if (len < 0) return len;
break;

Expand Down
2 changes: 1 addition & 1 deletion src/lib/util/struct.c
Expand Up @@ -263,7 +263,7 @@ ssize_t fr_struct_to_network(uint8_t *out, size_t outlen,
/*
* Determine the nested type and call the appropriate encoder
*/
len = fr_value_box_to_network(NULL, p, outlen, &vp->data, vp->da);
len = fr_value_box_to_network(NULL, p, outlen, &vp->data);
if (len <= 0) return -1;

if (child->flags.extra) {
Expand Down
62 changes: 50 additions & 12 deletions src/lib/util/value.c
Expand Up @@ -1016,16 +1016,14 @@ size_t fr_value_box_network_length(fr_value_box_t *value)
* @param[in] dst_len The length of the output buffer, or maximum value fragment
* size.
* @param[in] value to encode.
* @param[in] da attribute definition for extra "flags" fields.
* @return
* - 0 no bytes were written, see need value to determine if it was because
* the fr_value_box_t was #FR_TYPE_OCTETS/#FR_TYPE_STRING and was
* NULL (which is unfortunately valid)
* - >0 the number of bytes written to out.
* - <0 on error.
*/
ssize_t fr_value_box_to_network(size_t *need, uint8_t *dst, size_t dst_len, fr_value_box_t const *value,
fr_dict_attr_t const *da)
ssize_t fr_value_box_to_network(size_t *need, uint8_t *dst, size_t dst_len, fr_value_box_t const *value)
{
size_t min, max;
uint8_t *p = dst;
Expand Down Expand Up @@ -1056,8 +1054,8 @@ ssize_t fr_value_box_to_network(size_t *need, uint8_t *dst, size_t dst_len, fr_v
}

case FR_TYPE_DATE:
if (da) {
min = max = da->flags.length;
if (value->enumv) {
min = max = value->enumv->flags.length;
} else {
min = max = 4;
}
Expand Down Expand Up @@ -1152,10 +1150,10 @@ ssize_t fr_value_box_to_network(size_t *need, uint8_t *dst, size_t dst_len, fr_v
{
int64_t date = value->vb_date;

if (!da) {
if (!value->enumv) {
goto seconds;

} else switch (da->flags.type_size) {
} else switch (value->enumv->flags.type_size) {
seconds:
case FR_TIME_RES_SEC:
date = value->vb_date / 1000000000;
Expand All @@ -1176,10 +1174,10 @@ ssize_t fr_value_box_to_network(size_t *need, uint8_t *dst, size_t dst_len, fr_v
goto unsupported;
}

if (!da) {
if (!value->enumv) {
goto size4;

} else switch (da->flags.length) {
} else switch (value->enumv->flags.length) {
case 2:
if (date >= ((int64_t) 1) << 16) {
memset(dst, 0xff, 2);
Expand Down Expand Up @@ -1373,6 +1371,8 @@ ssize_t fr_value_box_from_network(TALLOC_CTX *ctx,
* the end. Shifting it every time.
*/
dst->vb_date = 0;
dst->enumv = enumv;

i = 0;
do {
dst->vb_date <<= 8;
Expand Down Expand Up @@ -3971,6 +3971,7 @@ int fr_value_box_from_str(TALLOC_CTX *ctx, fr_value_box_t *dst,
}

dst->vb_date = fr_time_from_timeval(&(struct timeval) {.tv_sec = date});
dst->enumv = dst_enumv;
}
break;

Expand Down Expand Up @@ -4709,13 +4710,50 @@ size_t fr_value_box_snprint(char *out, size_t outlen, fr_value_box_t const *data

case FR_TYPE_DATE:
t = fr_time_to_sec(data->vb_date);
if (!data->enumv || (data->enumv->flags.type_size == FR_TIME_RES_SEC)) {
if (quote > 0) {
len = strftime(buf, sizeof(buf) - 1, "%%%b %e %Y %H:%M:%S %Z%%", localtime_r(&t, &s_tm));
} else {
len = strftime(buf, sizeof(buf), "%b %e %Y %H:%M:%S %Z", localtime_r(&t, &s_tm));
}
} else {
int64_t subseconds;

/*
* Print this out first, as it's always the same
*/
if (quote > 0) {
len = strftime(buf, sizeof(buf) - 1, "%%%Y-%m-%dT%H:%M:%S", localtime_r(&t, &s_tm));
} else {
len = strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S", localtime_r(&t, &s_tm));
}

subseconds = data->vb_date % NSEC;

switch (data->enumv->flags.type_size) {
default:
break;

case FR_TIME_RES_MSEC:
subseconds /= 1000000;
len += snprintf(buf + len, sizeof(buf) - len - 1, "%03" PRIi64, subseconds);
break;

case FR_TIME_RES_USEC:
subseconds /= 1000;
len += snprintf(buf + len, sizeof(buf) - len - 1, "%06" PRIi64, subseconds);
break;

case FR_TIME_RES_NSEC:
len += snprintf(buf + len, sizeof(buf) - len - 1, "%09" PRIi64, subseconds);
break;
}
}

if (quote > 0) {
len = strftime(buf, sizeof(buf) - 1, "%%%b %e %Y %H:%M:%S %Z%%", localtime_r(&t, &s_tm));
buf[0] = (char) quote;
buf[len - 1] = (char) quote;
buf[len] = '\0';
} else {
len = strftime(buf, sizeof(buf), "%b %e %Y %H:%M:%S %Z", localtime_r(&t, &s_tm));
}
a = buf;
break;
Expand Down
3 changes: 1 addition & 2 deletions src/lib/util/value.h
Expand Up @@ -504,8 +504,7 @@ int fr_value_box_hton(fr_value_box_t *dst, fr_value_box_t const *src);

size_t fr_value_box_network_length(fr_value_box_t *value);

ssize_t fr_value_box_to_network(size_t *need, uint8_t *out, size_t outlen, fr_value_box_t const *value,
fr_dict_attr_t const *da) CC_HINT(nonnull(2,4));
ssize_t fr_value_box_to_network(size_t *need, uint8_t *out, size_t outlen, fr_value_box_t const *value);

ssize_t fr_value_box_from_network(TALLOC_CTX *ctx,
fr_value_box_t *dst, fr_type_t type, fr_dict_attr_t const *enumv,
Expand Down
2 changes: 1 addition & 1 deletion src/protocols/dhcpv4/encode.c
Expand Up @@ -118,7 +118,7 @@ static ssize_t encode_value(uint8_t *out, size_t outlen,
case FR_TYPE_ETHERNET:
case FR_TYPE_STRING:
case FR_TYPE_OCTETS:
len = fr_value_box_to_network(&need, p, outlen, &vp->data, vp->da);
len = fr_value_box_to_network(&need, p, outlen, &vp->data);
if (len < 0) return -2;
if (need > 0) return -1;
p += len;
Expand Down
2 changes: 1 addition & 1 deletion src/protocols/dhcpv6/encode.c
Expand Up @@ -396,7 +396,7 @@ static ssize_t encode_value(uint8_t *out, size_t outlen,
case FR_TYPE_IFID:
case FR_TYPE_ETHERNET:
CHECK_FREESPACE(outlen, fr_dhcpv6_option_len(vp));
slen = fr_value_box_to_network(NULL, p, end - p, &vp->data, vp->da);
slen = fr_value_box_to_network(NULL, p, end - p, &vp->data);
if (slen < 0) return PAIR_ENCODE_ERROR;
p += slen;
break;
Expand Down
2 changes: 1 addition & 1 deletion src/protocols/radius/encode.c
Expand Up @@ -677,7 +677,7 @@ static ssize_t encode_value(uint8_t *out, size_t outlen,
case FR_TYPE_INT32:
case FR_TYPE_INT64:
case FR_TYPE_DATE:
len = fr_value_box_to_network(NULL, buffer, sizeof(buffer), &vp->data, vp->da);
len = fr_value_box_to_network(NULL, buffer, sizeof(buffer), &vp->data);
if (len < 0) return -1;
data = buffer;
break;
Expand Down

0 comments on commit 8c739f3

Please sign in to comment.