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