From: Nick Porter Date: Thu, 5 May 2022 10:46:04 +0000 (+0100) Subject: Define fr_internal_encode_list() to internally encode a fr_pair_list_t X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=46b6ab3a11544551e33bfa30ca73e064892220c4;p=thirdparty%2Ffreeradius-server.git Define fr_internal_encode_list() to internally encode a fr_pair_list_t --- diff --git a/src/protocols/internal/encode.c b/src/protocols/internal/encode.c index 3fbb9238b3e..fd8b0f5a6eb 100644 --- a/src/protocols/internal/encode.c +++ b/src/protocols/internal/encode.c @@ -279,6 +279,32 @@ ssize_t fr_internal_encode_pair(fr_dbuff_t *dbuff, fr_dcursor_t *cursor, void *e return internal_encode(dbuff, &da_stack, 0, cursor, encode_ctx); } +/** Encode a list of pairs using the internal encoder + * + * @param[out] dbuff Where to write encoded data. + * @param[in] list List of attributes to encode. + * @param[in] encode_ctx Additional data to be used by the encoder. + * @return + * - length of encoded data on success + * - < 0 on failure + */ +ssize_t fr_internal_encode_list(fr_dbuff_t *dbuff, fr_pair_list_t const *list, void *encode_ctx) +{ + fr_pair_t *vp; + fr_dcursor_t dcursor; + ssize_t ret, len = 0; + + for (vp = fr_pair_dcursor_init(&dcursor, list); + vp; + vp = fr_dcursor_current(&dcursor)) { + ret = fr_internal_encode_pair(dbuff, &dcursor, encode_ctx); + if (ret < 0) return ret; + len += ret; + } + + return len; +} + /* * Test points */ diff --git a/src/protocols/internal/internal.h b/src/protocols/internal/internal.h index 5b940a67adb..5622f42f37b 100644 --- a/src/protocols/internal/internal.h +++ b/src/protocols/internal/internal.h @@ -43,6 +43,8 @@ ssize_t fr_internal_encode_pair(fr_dbuff_t *dbuff, fr_dcursor_t *cursor, void *encode_ctx); +ssize_t fr_internal_encode_list(fr_dbuff_t *dbuff, fr_pair_list_t const *list, void *encode_ctx); + ssize_t fr_internal_decode_pair(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_attr_t const *parent, uint8_t const *data, size_t data_len, void *decode_ctx);