Alphabetise radsec.sym.
[libradsec.git] / lib / examples / client-dispatch.c
1 /* RADIUS/RadSec client using libradsec in user dispatch mode. */
2
3 #include <stdio.h>
4 #include <string.h>
5 #include <radsec/radsec.h>
6 #include <event2/event.h>
7 #include "debug.h"              /* For rs_dump_packet().  */
8
9 #define CONFIG "dispatching-tls"
10 #define CONFIG_FILE "examples/client.conf"
11
12 #define SECRET "sikrit"
13 #define USER_NAME "molgan@PROJECT-MOONSHOT.ORG"
14 #define USER_PW "password"
15
16 struct state {
17   struct rs_packet *msg;
18   unsigned packet_sent_flag : 1;
19   unsigned packet_received_flag : 1;
20 };
21
22 static void
23 connected_cb (void *user_data)
24 {
25   printf ("%s\n", __FUNCTION__);
26 }
27
28 static void
29 disconnected_cb (void *user_data)
30 {
31   printf ("%s\n", __FUNCTION__);
32 }
33
34 static void
35 msg_received_cb (struct rs_packet *packet, void *user_data)
36 {
37   struct state *state = (struct state *) user_data;
38
39   printf ("%s\n", __FUNCTION__);
40
41   state->msg = packet;
42   state->packet_received_flag = 1;
43 }
44
45 static void
46 msg_sent_cb (void *user_data)
47 {
48   struct state *state = (struct state *) user_data;
49
50   printf ("%s\n", __FUNCTION__);
51
52   rs_packet_destroy (state->msg);
53   state->packet_sent_flag = 1;
54 }
55
56 struct rs_error *
57 dispatching_client (struct rs_context *ctx)
58 {
59   struct rs_connection *conn = NULL;
60   struct rs_conn_callbacks cb = { connected_cb, disconnected_cb,
61                                   msg_received_cb, msg_sent_cb };
62   struct rs_packet *req_msg = NULL;
63   struct rs_error *err = NULL;
64   struct state state;
65
66   memset (&state, 0, sizeof (state));
67
68   if (rs_conn_create(ctx, &conn, CONFIG))
69     goto out;
70   rs_conn_set_callbacks (conn, &cb, &state);
71   if (rs_packet_create_authn_request (conn, &req_msg, USER_NAME, USER_PW))
72     goto out;
73   /* Doesn't really send the message but rather queues it for sending.
74      msg_received_cb() will be invoked with user_data = &state when
75      the message has been sent.  */
76   if (rs_packet_send (req_msg))
77     goto out;
78
79   while (1)
80     {
81       if (rs_conn_dispatch (conn))
82         goto out;
83       if (state.packet_received_flag)
84         {
85           rs_dump_packet (state.msg); /* debug printout */
86           if (rs_packet_code (state.msg) == PW_ACCESS_ACCEPT)
87             printf ("Good auth.\n");
88           else
89             printf ("Bad auth: %d\n", rs_packet_code (state.msg));
90           rs_packet_destroy (state.msg);
91           break;
92         }
93     }
94
95   if (rs_conn_destroy(conn))
96     goto out;
97   conn = NULL;
98
99  out:
100   err = rs_err_ctx_pop (ctx);
101   if (err == RSE_OK)
102     err = rs_err_conn_pop (conn);
103
104   if (conn)
105     rs_conn_destroy(conn);
106
107   return err;
108 }
109
110 int
111 main (int argc, char *argv[])
112 {
113   struct rs_error *err = NULL;
114   struct rs_context *ctx = NULL;
115
116   if (rs_context_create(&ctx))
117     goto out;
118   if (rs_context_read_config(ctx, CONFIG_FILE))
119     goto out;
120
121   err = dispatching_client (ctx);
122
123  out:
124   if (ctx)
125     rs_context_destroy(ctx);
126
127   if (err)
128     {
129       fprintf (stderr, "error: %s: %d\n", rs_err_msg (err), rs_err_code (err, 0));
130       return rs_err_code (err, 1);
131     }
132   return 0;
133 }