rc_aaa_ctx_server(3)

πŸ“¦
version 1.5.2 Β· 4 versions
, in alpine 3.24, epel 10, fedora 43, fedora 44, nixos 26.05, nixpkgs unstable, opensuse-leap 16.0

✨ rc_aaa_ctx_server(3) ✨

okay so bestie, welcome to rc_aaa_ctx_server from section 3 of the radcli manual β€” yes, the Radius client library, we're doing the deep lore today πŸ’…


🌸 NAME 🌸

rc_aaa_ctx_server -

(no cap, that's literally the whole NAME entry β€” the description slot is empty, the vibes are immaculate, the mystery is real 🫢)


πŸŽ€ SYNOPSIS πŸŽ€

#include <radcli/radcli.h>

int rc_aaa_ctx_server(
    rc_handle        *rh,
    RC_AAA_CTX      **ctx,
    SERVER           *aaaserver,
    rc_type           type,
    uint32_t          client_port,
    VALUE_PAIR       *send,
    VALUE_PAIR      **received,
    char             *msg,
    int               add_nas_port,
    rc_standard_codes request_type
);

πŸ’– DESCRIPTION πŸ’–

So what this does is: it builds an authentication/accounting request for port id nas_port, using the value_pairs in send, and submits it to a specified server. That's the whole moment. πŸ‘‘

Here's the iconic part β€” this function keeps its state in ctx after a successful operation. Like, it remembers things. It's a keeper. And when you're done with it you can deallocate it using rc_aaa_ctx_free(). Clean up after yourself, bestie, that's the rule. 🧹✨


πŸ¦‹ PARAMETERS πŸ¦‹

  • rh β€” a handle to parsed configuration.
  • ctx β€” if non-NULL it will contain the context of the request; its initial value should be NULL and it must be released using rc_aaa_ctx_free().
  • aaaserver β€” a non-NULL SERVER to send the message to.
  • type β€”
  • client_port β€”
  • send β€” a VALUE_PAIR array of values (e.g., PW_USER_NAME).
  • received β€” an allocated array of received values.
  • msg β€” must be an array of PW_MAX_MSG_SIZE or NULL; will contain the concatenation of any PW_REPLY_MESSAGE received.
  • add_nas_port β€” this should be zero; if non-zero it will include PW_NAS_PORT in sent pairs.
  • request_type β€” one of standard RADIUS codes (e.g., PW_ACCESS_REQUEST).
ok so type and client_port have literally nothing written next to them in the original. not me leaving them blank too, fr fr. zero notes, just vibes πŸ’€

🌈 STRUCTURES 🌈

⚠️ Avoid using this structure directly, it is included for backwards compatibility only. Several of its fields have been deprecated. Like, please don't. It's giving legacy.
struct server {
  int      max;
  char    *name[RC_SERVER_MAX];
  uint16_t port[RC_SERVER_MAX];
  char    *secret[RC_SERVER_MAX];
  double   deadtime_ends[RC_SERVER_MAX]; // unused
};
⚠️ Avoid using this structure directly. Use the rc_avpair_get_ functions. seriously, use the functions, they're right there 🫢
struct rc_value_pair {
  char                   name[RC_NAME_LENGTH+1];      // attribute name if known.
  uint64_t               attribute; // attribute numeric value of type rc_attr_id including vendor; use VENDOR() and ATTRID() to separate.
  rc_attr_type           type;      // attribute type.
  uint32_t               lvalue;    // attribute value if type is PW_TYPE_INTEGER, PW_TYPE_DATE or PW_TYPE_IPADDR.
  char                   strvalue[AUTH_STRING_LEN+1];  // contains attribute value in other cases.
  struct rc_value_pair  *next;
  char                   pad[32];       // unused pad
};
⚠️ Avoid using this structure directly. Use the rc_avpair_get_ functions. (yes, this is the exact same struct again, and yes, the original page lists it twice. we keep both. we do not edit the source material. periodt. πŸ’…)
struct rc_value_pair {
  char                   name[RC_NAME_LENGTH+1];      // attribute name if known.
  uint64_t               attribute; // attribute numeric value of type rc_attr_id including vendor; use VENDOR() and ATTRID() to separate.
  rc_attr_type           type;      // attribute type.
  uint32_t               lvalue;    // attribute value if type is PW_TYPE_INTEGER, PW_TYPE_DATE or PW_TYPE_IPADDR.
  char                   strvalue[AUTH_STRING_LEN+1];  // contains attribute value in other cases.
  struct rc_value_pair  *next;
  char                   pad[32];       // unused pad
};

⭐ RETURN VALUE ⭐

so here's what you get back:

  • the received value_pairs land in received πŸ’Œ
  • messages from the server land in msg πŸ’Œ
  • OK_RC (0) on success β€” slay ✨
  • CHALLENGE_RC (3) when an Access-Challenge is received
  • negative on failure as the return value 😭

πŸ‘‘ SEE ALSO πŸ‘‘

radcli.h(3), rc_aaa(3), rc_aaa_ctx(3), rc_aaa_ctx_free(3), rc_aaa_ctx_get_secret(3), rc_aaa_ctx_get_vector(3), rc_aaa_ctx_server(3), rc_acct(3), rc_acct_proxy(3), rc_add_config(3), rc_apply_config(3), rc_auth(3), rc_auth_proxy(3), rc_avpair_add(3), rc_avpair_assign(3), rc_avpair_copy(3), rc_avpair_free(3), rc_avpair_gen(3), rc_avpair_get(3), rc_avpair_get_attr(3), rc_avpair_get_in6(3), rc_avpair_get_raw(3), rc_avpair_get_uint32(3), rc_avpair_insert(3), rc_avpair_log(3), rc_avpair_new(3), rc_avpair_next(3), rc_avpair_parse(3), rc_avpair_remove(3), rc_avpair_tostr(3), rc_buildreq(3), rc_check(3), rc_check_tls(3), rc_conf_int(3), rc_conf_srv(3), rc_conf_str(3), rc_config_free(3), rc_config_init(3), rc_destroy(3), rc_dict_addattr(3), rc_dict_addval(3), rc_dict_addvend(3), rc_dict_findattr(3), rc_dict_findval(3), rc_dict_findvend(3), rc_dict_free(3), rc_dict_getattr(3), rc_dict_getval(3), rc_dict_getvend(3), rc_find_server_addr(3), rc_get_socket_type(3), rc_get_srcaddr(3), rc_getport(3), rc_mksid(3), rc_new(3), rc_openlog(3), rc_own_hostname(3), rc_read_config(3), rc_read_dictionary(3), rc_read_dictionary_from_buffer(3), rc_send_server(3), rc_setdebug(3), rc_test_config(3), rc_tls_fd(3), rc_aaa_ctx_free()


that's the whole page bestie, you ate it up πŸ“πŸ§š

this came from the radcli crew, dated 2023-01-29, and the page itself is rc_aaa_ctx_server(3) β€” ily, go read some more manpages, mwah πŸ’œβœ¨

πŸ“¦ where this page comes from