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