---
name: "radcli_avp_get_cstr"
section: "3"
platform: "linux"
package: "radcli"
version: "2.0.1-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/radcli_avp_get_cstr"
---

# radcli\_avp\_get\_cstr(3)

Read an attribute's value as a NUL-terminated string, with no allocation or copy.

## NAME

radcli\_avp\_get\_cstr - Read an attribute's value as a NUL-terminated string, with no allocation or copy.

## SYNOPSIS

```
#include <radcli/>

const char * radcli_avp_get_cstr(
    const radcli_avp  *a
);
```

## DESCRIPTION

Meaningful for RADCLI\_TYPE\_STRING and RADCLI\_TYPE\_TEXT attributes, but callable on any type, like radcli\_avp\_get\_bytes()  every attribute is stored with a trailing NUL one byte past its real length, so this never allocates. Returns NULL, rather than a silently short string, if the value contains an embedded NUL byte before its real end (logged at LOG\_WARNING): a server-supplied value of e.g. "admin attacker" must not be readable back as the trusted string "admin" by any caller that treats this return value as the whole attribute. Use radcli\_avp\_get\_bytes() instead for an attribute where an embedded NUL is expected and meaningful (e.g. one whose dictionary type is not RADCLI\_TYPE\_STRING or RADCLI\_TYPE\_TEXT).

For a RADCLI\_TYPE\_TEXT attribute specifically, this also returns NULL (logged at LOG\_WARNING) if the value is not valid UTF-8 (RFC 8044 SS3.1)  checked here as well as in radcli\_avp\_add\_str(), since an attribute can also be populated by radcli\_avp\_decode() from a received packet, whose bytes never went through add-side validation. RADCLI\_TYPE\_STRING attributes have no such requirement: NUL-checked only, like every other type.

## PARAMETERS

- **a**

  the attribute.

## RETURN VALUE

a pointer valid for a's lifetime (owned by the list a came from  never freed by the caller), or NULL if a is NULL, its value contains an embedded NUL byte, or (for RADCLI\_TYPE\_TEXT) its value is not valid UTF-8.

## SEE ALSO

[*radcli\_avp\_add\_bytes*(3)](/radcli_avp_add_bytes/3.md), [*radcli\_avp\_add\_bytes\_by\_num*(3)](/radcli_avp_add_bytes_by_num/3.md), [*radcli\_avp\_add\_gigawords64*(3)](/radcli_avp_add_gigawords64/3.md), [*radcli\_avp\_add\_gigawords64\_by\_num*(3)](/radcli_avp_add_gigawords64_by_num/3.md), [*radcli\_avp\_add\_ip4*(3)](/radcli_avp_add_ip4/3.md), [*radcli\_avp\_add\_ip4\_by\_num*(3)](/radcli_avp_add_ip4_by_num/3.md), [*radcli\_avp\_add\_ip4prefix*(3)](/radcli_avp_add_ip4prefix/3.md), [*radcli\_avp\_add\_ip4prefix\_by\_num*(3)](/radcli_avp_add_ip4prefix_by_num/3.md), [*radcli\_avp\_add\_ip6*(3)](/radcli_avp_add_ip6/3.md), [*radcli\_avp\_add\_ip6\_by\_num*(3)](/radcli_avp_add_ip6_by_num/3.md), [*radcli\_avp\_add\_str*(3)](/radcli_avp_add_str/3.md), [*radcli\_avp\_add\_str\_by\_num*(3)](/radcli_avp_add_str_by_num/3.md), [*radcli\_avp\_add\_uint32*(3)](/radcli_avp_add_uint32/3.md), [*radcli\_avp\_add\_uint32\_by\_num*(3)](/radcli_avp_add_uint32_by_num/3.md), [*radcli\_avp\_add\_uint64*(3)](/radcli_avp_add_uint64/3.md), [*radcli\_avp\_add\_uint64\_by\_num*(3)](/radcli_avp_add_uint64_by_num/3.md), [*radcli\_avp\_add\_username*(3)](/radcli_avp_add_username/3.md), [*radcli\_avp\_concat\_str*(3)](/radcli_avp_concat_str/3.md), [*radcli\_avp\_concat\_str\_by\_num*(3)](/radcli_avp_concat_str_by_num/3.md), [*radcli\_avp\_def*(3)](/radcli_avp_def/3.md), [*radcli\_avp\_get*(3)](/radcli_avp_get/3.md), [*radcli\_avp\_get\_by\_num*(3)](/radcli_avp_get_by_num/3.md), [*radcli\_avp\_get\_bytes*(3)](/radcli_avp_get_bytes/3.md), [*radcli\_avp\_get\_bytes\_by\_num*(3)](/radcli_avp_get_bytes_by_num/3.md), [*radcli\_avp\_get\_cstr\_by\_num*(3)](/radcli_avp_get_cstr_by_num/3.md), [*radcli\_avp\_get\_gigawords64*(3)](/radcli_avp_get_gigawords64/3.md), [*radcli\_avp\_get\_gigawords64\_by\_num*(3)](/radcli_avp_get_gigawords64_by_num/3.md), [*radcli\_avp\_get\_ip4prefix*(3)](/radcli_avp_get_ip4prefix/3.md), [*radcli\_avp\_get\_ip4prefix\_by\_num*(3)](/radcli_avp_get_ip4prefix_by_num/3.md), [*radcli\_avp\_get\_ip6*(3)](/radcli_avp_get_ip6/3.md), [*radcli\_avp\_get\_ip6\_by\_num*(3)](/radcli_avp_get_ip6_by_num/3.md), [*radcli\_avp\_get\_uint32*(3)](/radcli_avp_get_uint32/3.md), [*radcli\_avp\_get\_uint32\_by\_num*(3)](/radcli_avp_get_uint32_by_num/3.md), [*radcli\_avp\_get\_uint64*(3)](/radcli_avp_get_uint64/3.md), [*radcli\_avp\_get\_uint64\_by\_num*(3)](/radcli_avp_get_uint64_by_num/3.md), [*radcli\_avp\_iter\_next*(3)](/radcli_avp_iter_next/3.md), [*radcli\_avp\_list\_error*(3)](/radcli_avp_list_error/3.md), [*radcli\_avp\_list\_free*(3)](/radcli_avp_list_free/3.md), [*radcli\_avp\_list\_iter*(3)](/radcli_avp_list_iter/3.md), [*radcli\_avp\_list\_new*(3)](/radcli_avp_list_new/3.md)
