1 /* RADIUS/RadSec server using libradsec. */
3 /* Copyright 2013 NORDUnet A/S. All rights reserved.
4 See LICENSE for licensing information. */
10 #include <radsec/radsec.h>
11 #include <event2/event.h>
12 #include "debug.h" /* For rs_dump_message(). */
14 #define CONFIG_FILE "examples/server.conf"
17 #define SECRET "sikrit"
18 #define USER_NAME "molgan@PROJECT-MOONSHOT.ORG"
19 #define USER_PW "password"
21 static struct rs_peer *
22 client_filter_cb (const struct rs_listener *listener,
25 printf ("DEBUG: listener %p (user_data=%p) asking for a client filter list\n",
31 disco_cb (void *user_data)
33 struct rs_connection *conn = user_data;
35 printf ("DEBUG: conn %p disconnected\n", conn);
39 read_cb (struct rs_message *message, void *user_data)
41 struct rs_connection *conn = user_data;
43 printf ("DEBUG: msg received on connection %p\n", conn);
44 rs_dump_message (message);
45 //if (message_verify_response (conn, fixme)) error;
49 new_conn_cb (struct rs_connection *conn, void *user_data)
51 const struct rs_listener *l = user_data;
52 struct rs_conn_callbacks cb = {NULL, /* connected */
57 printf ("DEBUG: new connection on listener %p: %p, fd=%d\n",
58 l, conn, rs_conn_get_fd (conn));
59 rs_conn_set_callbacks (conn, &cb, conn);
63 err_cb (struct rs_connection *conn, void *user_data)
65 struct rs_listener *listener = user_data;
66 struct rs_error *err = NULL;
68 err = rs_err_conn_pop (conn);
70 printf ("DEBUG: error on conn %p, listener %p: %d (%s)\n", conn, listener,
71 rs_err_code (err, 0), rs_err_msg (err));
76 stdin_cb (evutil_socket_t s, short flags, void *user_data)
78 struct rs_listener *l = user_data;
80 printf ("DEBUG: got data on stdin, quitting\n");
81 assert (event_base_loopbreak (rs_listener_get_eventbase (l)) == 0);
86 server (struct rs_context *ctx)
89 struct rs_error *err = NULL;
90 struct rs_listener *listener = NULL;
91 const struct rs_listener_callbacks cbs =
92 {client_filter_cb, new_conn_cb, err_cb};
93 struct event *read_event = NULL;
95 if (rs_listener_create (ctx, &listener, CONFIG))
97 rs_listener_set_callbacks (listener, &cbs, listener);
98 if (rs_listener_listen (listener))
102 /* Listen on stdin too, for quitting the server nicely without
103 having to trap SIGKILL. */
104 read_event = event_new (rs_listener_get_eventbase (listener),
109 assert (read_event != NULL);
110 assert (event_add (read_event, NULL) == 0);
114 r = rs_listener_dispatch (listener);
117 printf ("DEBUG: rs_listener_dispatch done (r=%d)\n", r);
119 printf ("DEBUG: libevent signals error: %s\n", evutil_gai_strerror (r));
121 printf ("DEBUG: no events registered, exiting\n");
124 err = rs_err_ctx_pop (ctx);
126 err = rs_err_listener_pop (listener);
129 event_free (read_event);
133 assert (rs_listener_close (listener) == RSE_OK);
134 //rs_listener_destroy (listener);
142 main (int argc, char *argv[])
144 struct rs_error *err = NULL;
145 struct rs_context *ctx = NULL;
147 if (rs_context_create (&ctx))
149 if (rs_context_read_config (ctx, CONFIG_FILE))
152 { /* DEBUG printouts */
154 int err = rs_context_print_config (ctx, &buf);
155 assert (err == RSE_OK);
165 fprintf (stderr, "%s: error: %s: %d\n",
166 argv[0], rs_err_msg (err), rs_err_code (err, 0));
167 return rs_err_code (err, 1);
171 rs_context_destroy (ctx);