Enable tls psk
[libradsec.git] / peer.c
1 /* Copyright 2010-2012 NORDUnet A/S. All rights reserved.
2    See LICENSE 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 #include "util.h"
17
18 struct rs_peer *
19 peer_pick_peer (struct rs_connection *conn)
20 {
21   assert (conn);
22
23   if (conn->active_peer)
24     conn->active_peer = conn->active_peer->next; /* Next.  */
25   if (!conn->active_peer)
26     conn->active_peer = conn->peers; /* From the top.  */
27
28   return conn->active_peer;
29 }
30
31 struct rs_peer *
32 peer_create (struct rs_context *ctx, struct rs_peer **rootp)
33 {
34   struct rs_peer *p;
35
36   p = (struct rs_peer *) rs_malloc (ctx, sizeof(*p));
37   if (p)
38     {
39       memset (p, 0, sizeof(struct rs_peer));
40       if (*rootp)
41         {
42           p->next = (*rootp)->next;
43           (*rootp)->next = p;
44         }
45       else
46         *rootp = p;
47     }
48   return p;
49 }
50
51 /* Public functions.  */
52 int
53 rs_peer_create (struct rs_connection *conn, struct rs_peer **peer_out)
54 {
55   struct rs_peer *peer;
56
57   peer = peer_create (conn->ctx, &conn->peers);
58   if (peer)
59     {
60       peer->conn = conn;
61       peer->realm->timeout = 2; /* FIXME: Why?  */
62       peer->realm->retries = 2; /* FIXME: Why?  */
63     }
64   else
65     return rs_err_conn_push_fl (conn, RSE_NOMEM, __FILE__, __LINE__, NULL);
66   if (*peer_out)
67     *peer_out = peer;
68   return RSE_OK;
69 }
70
71 int
72 rs_peer_set_address (struct rs_peer *peer, const char *hostname,
73                      const char *service)
74 {
75   assert (peer);
76   assert (peer->conn);
77   assert (peer->conn->ctx);
78
79   peer->hostname = rs_strdup (peer->conn->ctx, hostname);
80   peer->service = rs_strdup (peer->conn->ctx, service);
81   if (peer->hostname == NULL || peer->service == NULL)
82     return RSE_NOMEM;
83
84   return RSE_OK;
85 }
86
87 void
88 rs_peer_set_timeout (struct rs_peer *peer, int timeout)
89 {
90   assert (peer);
91   assert (peer->realm);
92   peer->realm->timeout = timeout;
93 }
94 void
95 rs_peer_set_retries (struct rs_peer *peer, int retries)
96 {
97   assert (peer);
98   assert (peer->realm);
99   peer->realm->retries = retries;
100 }
101
102 int
103 rs_peer_set_secret (struct rs_peer *peer, const char *secret)
104 {
105   if (peer->secret)
106     free (peer->secret);
107   peer->secret = (char *) malloc (strlen(secret) + 1);
108   if (!peer->secret)
109     return rs_err_conn_push (peer->conn, RSE_NOMEM, NULL);
110   strcpy (peer->secret, secret);
111   return RSE_OK;
112 }
113