.\" File automatically generated by doxy2man0.3 .\" Generation date: Thu Sep 3 2026 .TH radcli_avp_concat_str_by_num 3 2026-09-03 "radcli" "Radius client library" .SH "NAME" radcli_avp_concat_str_by_num \- Look up an attribute by legacy numeric ID and concatenate every occurrence into a bounded buffer. .SH SYNOPSIS .nf .B #include .sp \fBint radcli_avp_concat_str_by_num\fP( \fBchar *\fP\fIbuf\fP, \fBsize_t \fP\fIbuflen\fP, \fBconst radcli_avp_list *\fP\fIlist\fP, \fBconst radcli_ctx *\fP\fIctx\fP, \fBuint32_t \fP\fIattrid\fP, \fBuint32_t \fP\fIvendor\fP, \fBconst char *\fP\fIsep\fP ); .fi .SH DESCRIPTION .PP The _by_num() wrapper for radcli_avp_concat_str(): equivalent to radcli_avp_concat_str(buf, buflen, l, radcli_dict_lookup_num(ctx, attrid, .PP vendor), sep), except that an unresolvable attribute ID is not itself a failure here it is treated the same as "no occurrence present" (buf set to an empty string, 0 returned), matching this function's legacy-ID convenience role: a caller passing a well-known PW_* constant should not have to separately handle "not in this dictionary" as an error case, the same way rc_aaa()'s msg never failed just because a reply had no Reply-Message. .SH PARAMETERS .TP .B buf destination buffer, or NULL to only compute the needed size; see radcli_avp_concat_str(). .TP .B buflen size of buf, in bytes; may be 0. .TP .B list the list to search. .TP .B ctx a context with a dictionary loaded. .TP .B attrid the attribute ID (a PW_* constant, or a vendor type ID when vendor is non-zero). .TP .B vendor the vendor PEN, or 0 for a standard attribute. .TP .B sep separator inserted between occurrences; NULL or "" for none. .SH RETURN VALUE .PP the number of bytes the joined result occupies (excluding the NUL terminator), whether or not it fit in buf; 0 if attrid/vendor resolves to no attribute. .SH SEE ALSO .PP .nh .ad l \fIradcli_avp_add_bytes\fP(3), \fIradcli_avp_add_bytes_by_num\fP(3), \fIradcli_avp_add_gigawords64\fP(3), \fIradcli_avp_add_gigawords64_by_num\fP(3), \fIradcli_avp_add_ip4\fP(3), \fIradcli_avp_add_ip4_by_num\fP(3), \fIradcli_avp_add_ip4prefix\fP(3), \fIradcli_avp_add_ip4prefix_by_num\fP(3), \fIradcli_avp_add_ip6\fP(3), \fIradcli_avp_add_ip6_by_num\fP(3), \fIradcli_avp_add_str\fP(3), \fIradcli_avp_add_str_by_num\fP(3), \fIradcli_avp_add_uint32\fP(3), \fIradcli_avp_add_uint32_by_num\fP(3), \fIradcli_avp_add_uint64\fP(3), \fIradcli_avp_add_uint64_by_num\fP(3), \fIradcli_avp_add_username\fP(3), \fIradcli_avp_concat_str\fP(3), \fIradcli_avp_def\fP(3), \fIradcli_avp_get\fP(3), \fIradcli_avp_get_by_num\fP(3), \fIradcli_avp_get_bytes\fP(3), \fIradcli_avp_get_bytes_by_num\fP(3), \fIradcli_avp_get_cstr\fP(3), \fIradcli_avp_get_cstr_by_num\fP(3), \fIradcli_avp_get_gigawords64\fP(3), \fIradcli_avp_get_gigawords64_by_num\fP(3), \fIradcli_avp_get_ip4prefix\fP(3), \fIradcli_avp_get_ip4prefix_by_num\fP(3), \fIradcli_avp_get_ip6\fP(3), \fIradcli_avp_get_ip6_by_num\fP(3), \fIradcli_avp_get_uint32\fP(3), \fIradcli_avp_get_uint32_by_num\fP(3), \fIradcli_avp_get_uint64\fP(3), \fIradcli_avp_get_uint64_by_num\fP(3), \fIradcli_avp_iter_next\fP(3), \fIradcli_avp_list_error\fP(3), \fIradcli_avp_list_free\fP(3), \fIradcli_avp_list_iter\fP(3), \fIradcli_avp_list_new\fP(3) .ad .hy