41#include <radcli/radcli.h>
42#include <radcli/radcli2.h>
44static int opt_nak = 0;
45static uint32_t opt_error_cause = 0;
46static int opt_no_reply = 0;
47static int opt_verbose = 0;
49static void print_attrs(
const radcli_avp_list *attrs)
63 printf(
"\t%s = %u\n", name, (
unsigned)v);
71 printf(
"\t%s = %s\n", name, inet_ntoa(ia));
79 char buf[INET6_ADDRSTRLEN];
81 inet_ntop(AF_INET6, &v6, buf,
sizeof(buf)) != NULL)
82 printf(
"\t%s = %s\n", name, buf);
88 printf(
"\t%s = %llu\n", name, (
unsigned long long)v);
96 printf(
"\t%s = %.*s\n", name, (
int)len, (
const char *)val);
106 const char *sid, *user_name;
110 printf(
"%s request:\n", code == RADCLI_DISCONNECT_REQUEST ?
"Disconnect" :
"CoA");
117 printf(
" (session-id: %s)\n", sid);
118 if (user_name != NULL)
119 printf(
" (user-name: %s)\n", user_name);
123 printf(
"(not replying)\n");
124 }
else if (opt_nak) {
125 printf(
"(sending NAK, Error-Cause %u)\n", (
unsigned)opt_error_cause);
128 printf(
"(sending ACK)\n");
135static void usage(
void)
138 "usage: raddaeserver [-f config_file] [--nak[=error-cause]] [--no-reply] [-v]\n");
142int main(
int argc,
char **argv)
144 const char *config_file = RC_CONFIG_FILE;
149 setvbuf(stdout, NULL, _IOLBF, 0);
150 openlog(
"raddaeserver", LOG_PID, LOG_DAEMON);
152 for (i = 1; i < argc; i++) {
153 if (strcmp(argv[i],
"-f") == 0 && i + 1 < argc) {
154 config_file = argv[++i];
155 }
else if (strcmp(argv[i],
"--no-reply") == 0) {
157 }
else if (strncmp(argv[i],
"--nak", 5) == 0) {
159 if (argv[i][5] ==
'=')
160 opt_error_cause = (uint32_t)strtoul(argv[i] + 6, NULL, 10);
161 }
else if (strcmp(argv[i],
"-v") == 0) {
168 rh = rc_read_config(config_file);
170 fprintf(stderr,
"raddaeserver: cannot read config %s\n", config_file);
176 fprintf(stderr,
"raddaeserver: dynamic authorization is not enabled or is "
177 "misconfigured (check dae-accept/dae-server/dae-secret)\n");
183 fprintf(stderr,
"raddaeserver: cannot start the listener\n");
189 printf(
"raddaeserver: listening\n");
201 if (poll(pfds, (nfds_t)nfds, timeout_ms) < 0) {
void radcli_dae_free(radcli_dae *dae)
Release a listener, closing its socket if radcli_dae_start() opened one.
const char * radcli_dae_req_session_id(const radcli_dae_request *req)
Return the request's Acct-Session-Id, if it carried one.
int radcli_ctx_get_poll(radcli_ctx *ctx, struct pollfd *pfds, size_t max_pfds, size_t *nfds, int *timeout_ms)
Report what to wait for on ctx's behalf, for the caller's own event loop – radcli never calls poll()/...
void radcli_dae_set_handler(radcli_dae *dae, radcli_dae_handler cb, void *user)
Register the callback radcli_ctx_dispatch() invokes for each validated request. May be called before ...
radcli_code radcli_dae_req_code(const radcli_dae_request *req)
Return the received packet's RADIUS code.
int radcli_ctx_dispatch(radcli_ctx *ctx)
Read what is ready on ctx's descriptor(s), validate it, and invoke the registered handler for anythin...
int radcli_dae_reply(radcli_dae_request *req, int ack)
Answer a request with an ACK or NAK, selecting 41/42 or 44/45 from the request's own code,...
struct radcli_dae_st radcli_dae
const char * radcli_dae_req_user_name(const radcli_dae_request *req)
Return the request's User-Name, if it carried one.
int radcli_dae_start(radcli_dae *dae)
Start receiving: binds the socket described by dae-listen.
const radcli_avp_list * radcli_dae_req_attrs(const radcli_dae_request *req)
Return the request's decoded attributes.
#define RADCLI_CTX_MAX_POLLFDS
int radcli_dae_reply_error(radcli_dae_request *req, uint32_t error_cause)
Answer a request with a NAK carrying the given Error-Cause.
radcli_dae * radcli_dae_new(radcli_ctx *ctx, unsigned flags)
Validate dae-* configuration and build a dynamic-authorization listener. Opens no socket – see radcli...
struct radcli_dae_request_st radcli_dae_request
void radcli_dae_request_free(radcli_dae_request *req)
Release a request.
int radcli_avp_get_uint64(const radcli_avp *a, uint64_t *out)
Read an attribute's value as a 64-bit integer or ifid.
radcli_avp_iter radcli_avp_list_iter(const radcli_avp_list *list)
Begin iterating list.
int radcli_avp_get_ip6(const radcli_avp *a, struct in6_addr *out, unsigned *prefix)
Read an attribute's value as an IPv6 address or prefix.
int radcli_avp_get_uint32(const radcli_avp *a, uint32_t *out)
Read an attribute's value as an integer/IPv4-address/date.
const radcli_attr_def * radcli_avp_def(const radcli_avp *a)
Return the attribute definition of a.
const radcli_avp * radcli_avp_iter_next(radcli_avp_iter *it)
Return the current attribute and advance.
int radcli_avp_get_bytes(const radcli_avp *a, const void **out, size_t *len)
Read an attribute's value as raw bytes.
const char * radcli_attr_def_name(const radcli_attr_def *def)
Return an attribute definition's canonical name.
radcli_attr_type radcli_attr_def_type(const radcli_attr_def *def)
Return an attribute definition's wire type.