Update to IETF RADIUS attributes
[libradsec.git] / lib / peer.c
1 /* Copyright 2010, 2011 NORDUnet A/S. All rights reserved.
2    See the file COPYING for licensing information.  */
3
4 #if defined HAVE_CONFIG_H
5 #include <config.h>
6 #endif
7
8 #include <assert.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 #include <radsec/radsec.h>
13 #include <radsec/radsec-impl.h>
14 #include "err.h"
15 #include "peer.h"
16
17 struct rs_peer *
18 peer_pick_peer (struct rs_connection *conn)
19 {
20   assert (conn);
21
22   if (conn->active_peer)
23     conn->active_peer = conn->active_peer->next; /* Next.  */
24   if (!conn->active_peer)
25     conn->active_peer = conn->peers; /* From the top.  */
26
27   return conn->active_peer;
28 }
29
30 struct rs_peer *
31 peer_create (struct rs_context *ctx, struct rs_peer **rootp)
32 {
33   struct rs_peer *p;
34
35   p = (struct rs_peer *) rs_malloc (ctx, sizeof(*p));
36   if (p)
37     {
38       memset (p, 0, sizeof(struct rs_peer));
39       if (*rootp)
40         {
41           p->next = (*rootp)->next;
42           (*rootp)->next = p;
43         }
44       else
45         *rootp = p;
46     }
47   return p;
48 }
49
50 /* Public functions.  */
51 int
52 rs_peer_create (struct rs_connection *conn, struct rs_peer **peer_out)
53 {
54   struct rs_peer *peer;
55
56   peer = peer_create (conn->ctx, &conn->peers);
57   if (peer)
58     {
59       peer->conn = conn;
60       peer->realm->timeout = 2; /* FIXME: Why?  */
61       peer->realm->retries = 2; /* FIXME: Why?  */
62     }
63   else
64     return rs_err_conn_push_fl (conn, RSE_NOMEM, __FILE__, __LINE__, NULL);
65   if (*peer_out)
66     *peer_out = peer;
67   return RSE_OK;
68 }
69
70 int
71 rs_peer_set_address (struct rs_peer *peer, const char *hostname,
72                        const char *service)
73 {
74   struct rs_error *err;
75
76   assert (peer);
77   assert (peer->realm);
78
79   err = rs_resolv (&peer->addr, peer->realm->type, hostname, service);
80   if (err)
81     return err_conn_push_err (peer->conn, err);
82   return RSE_OK;
83 }
84
85 void
86 rs_peer_set_timeout (struct rs_peer *peer, int timeout)
87 {
88   assert (peer);
89   assert (peer->realm);
90   peer->realm->timeout = timeout;
91 }
92 void
93 rs_peer_set_retries (struct rs_peer *peer, int retries)
94 {
95   assert (peer);
96   assert (peer->realm);
97   peer->realm->retries = retries;
98 }
99
100 int
101 rs_peer_set_secret (struct rs_peer *peer, const char *secret)
102 {
103   if (peer->secret)
104     free (peer->secret);
105   peer->secret = (char *) malloc (strlen(secret) + 1);
106   if (!peer->secret)
107     return rs_err_conn_push (peer->conn, RSE_NOMEM, NULL);
108   strcpy (peer->secret, secret);
109   return RSE_OK;
110 }
111