summaryrefslogtreecommitdiff
path: root/radsecproxy.c
diff options
context:
space:
mode:
authorvenaas <venaas>2007-06-21 15:44:36 +0000
committervenaas <venaas@e88ac4ed-0b26-0410-9574-a7f39faa03bf>2007-06-21 15:44:36 +0000
commit831b9348471933f3460a738e1bc5b4a43aaa45c1 (patch)
tree4e422fd457f1794f18fb222c4ea2183f3267bb8c /radsecproxy.c
parent991f3649c83cb277451c901a778bbc94d67c5f89 (diff)
creating clients on demand, moved creation of servers
git-svn-id: https://svn.testnett.uninett.no/radsecproxy/trunk@149 e88ac4ed-0b26-0410-9574-a7f39faa03bf
Diffstat (limited to 'radsecproxy.c')
-rw-r--r--radsecproxy.c153
1 files changed, 80 insertions, 73 deletions
diff --git a/radsecproxy.c b/radsecproxy.c
index f2bce54..93f4b6b 100644
--- a/radsecproxy.c
+++ b/radsecproxy.c
@@ -233,6 +233,57 @@ struct clsrvconf *find_peer(char type, struct sockaddr *addr, struct list *confs
return NULL;
}
+struct replyq *newreplyq(int size) {
+ struct replyq *replyq;
+
+ replyq = malloc(sizeof(struct replyq));
+ if (!replyq)
+ debugx(1, DBG_ERR, "malloc failed");
+ replyq->replies = calloc(MAX_REQUESTS, sizeof(struct reply));
+ if (!replyq->replies)
+ debugx(1, DBG_ERR, "malloc failed");
+ replyq->count = 0;
+ replyq->size = size;
+ pthread_mutex_init(&replyq->count_mutex, NULL);
+ pthread_cond_init(&replyq->count_cond, NULL);
+ return replyq;
+}
+
+void addclient(struct clsrvconf *conf) {
+ if (conf->clients) {
+ debug(DBG_ERR, "currently works with just one client per conf");
+ return;
+ }
+ conf->clients = malloc(sizeof(struct client));
+ if (!conf->clients) {
+ debug(DBG_ERR, "malloc failed");
+ return;
+ }
+ memset(conf->clients, 0, sizeof(struct client));
+ conf->clients->conf = conf;
+ conf->clients->replyq = conf->type == 'T' ? newreplyq(MAX_REQUESTS) : udp_server_replyq;
+}
+
+void addserver(struct clsrvconf *conf) {
+ if (conf->servers)
+ debugx(1, DBG_ERR, "currently works with just one server per conf");
+
+ conf->servers = malloc(sizeof(struct server));
+ if (!conf->servers)
+ debugx(1, DBG_ERR, "malloc failed");
+ memset(conf->servers, 0, sizeof(struct server));
+ conf->servers->conf = conf;
+
+ conf->servers->sock = -1;
+ pthread_mutex_init(&conf->servers->lock, NULL);
+ conf->servers->requests = calloc(MAX_REQUESTS, sizeof(struct request));
+ if (!conf->servers->requests)
+ debugx(1, DBG_ERR, "malloc failed");
+ conf->servers->newrq = 0;
+ pthread_mutex_init(&conf->servers->newrq_mutex, NULL);
+ pthread_cond_init(&conf->servers->newrq_cond, NULL);
+}
+
/* exactly one of client and server must be non-NULL */
/* should probably take peer list (client(s) or server(s)) as argument instead */
/* if *peer == NULL we return who we received from, else require it to be from peer */
@@ -285,17 +336,27 @@ unsigned char *radudpget(int s, struct client **client, struct server **server,
debug(DBG_WARN, "radudpget: got packet from wrong or unknown UDP peer, ignoring");
continue;
}
-
+
rad = malloc(len);
- if (rad)
- break;
- debug(DBG_ERR, "radudpget: malloc failed");
+ if (!rad) {
+ debug(DBG_ERR, "radudpget: malloc failed");
+ continue;
+ }
+
+ if (client && !*client) {
+ if (!p->clients)
+ addclient(p);
+ if (!p->clients) {
+ free(rad);
+ continue;
+ }
+ *client = p->clients;
+ } else if (server && !*server)
+ *server = p->servers;
+
+ break;
}
memcpy(rad, buf, len);
- if (client && !*client)
- *client = p->clients;
- else if (server && !*server)
- *server = p->servers;
if (sa)
*sa = from;
return rad;
@@ -1629,10 +1690,14 @@ int tlslistener() {
close(snew);
continue;
}
+
+ if (!conf->clients)
+ addclient(conf);
client = conf->clients;
- if (client->ssl) {
- debug(DBG_WARN, "Ignoring incoming TLS connection, already have one from this client");
+ if (!client || client->ssl) {
+ if (client)
+ debug(DBG_WARN, "Ignoring incoming TLS connection, already have one from this client");
shutdown(snew, SHUT_RDWR);
close(snew);
continue;
@@ -1748,61 +1813,6 @@ SSL_CTX *tlsgetctx(char *alt1, char *alt2) {
return t->ctx;
}
-struct replyq *newreplyq(int size) {
- struct replyq *replyq;
-
- replyq = malloc(sizeof(struct replyq));
- if (!replyq)
- debugx(1, DBG_ERR, "malloc failed");
- replyq->replies = calloc(MAX_REQUESTS, sizeof(struct reply));
- if (!replyq->replies)
- debugx(1, DBG_ERR, "malloc failed");
- replyq->count = 0;
- replyq->size = size;
- pthread_mutex_init(&replyq->count_mutex, NULL);
- pthread_cond_init(&replyq->count_cond, NULL);
- return replyq;
-}
-
-void addclient(struct clsrvconf *conf) {
- if (conf->clients)
- debugx(1, DBG_ERR, "currently works with just one client per conf");
-
- conf->clients = malloc(sizeof(struct client));
- if (!conf->clients)
- debugx(1, DBG_ERR, "malloc failed");
- memset(conf->clients, 0, sizeof(struct client));
- conf->clients->conf = conf;
-
- if (conf->type == 'T')
- conf->clients->replyq = newreplyq(MAX_REQUESTS);
- else {
- if (!udp_server_replyq)
- udp_server_replyq = newreplyq(client_udp_count * MAX_REQUESTS);
- conf->clients->replyq = udp_server_replyq;
- }
-}
-
-void addserver(struct clsrvconf *conf) {
- if (conf->servers)
- debugx(1, DBG_ERR, "currently works with just one server per conf");
-
- conf->servers = malloc(sizeof(struct server));
- if (!conf->servers)
- debugx(1, DBG_ERR, "malloc failed");
- memset(conf->servers, 0, sizeof(struct server));
- conf->servers->conf = conf;
-
- conf->servers->sock = -1;
- pthread_mutex_init(&conf->servers->lock, NULL);
- conf->servers->requests = calloc(MAX_REQUESTS, sizeof(struct request));
- if (!conf->servers->requests)
- debugx(1, DBG_ERR, "malloc failed");
- conf->servers->newrq = 0;
- pthread_mutex_init(&conf->servers->newrq_mutex, NULL);
- pthread_cond_init(&conf->servers->newrq_cond, NULL);
-}
-
void addrealm(char *value, char *server, char *message) {
int n;
struct realm *realm;
@@ -2362,23 +2372,20 @@ int main(int argc, char **argv) {
debug(DBG_INFO, "radsecproxy revision $Rev$ starting");
- for (entry = list_first(clconfs); entry; entry = list_next(entry))
- addclient((struct clsrvconf *)entry->data);
-
- for (entry = list_first(srvconfs); entry; entry = list_next(entry))
- addserver((struct clsrvconf *)entry->data);
-
if (client_udp_count) {
udp_server_listen = server_create('U');
+ udp_server_replyq = newreplyq(client_udp_count * MAX_REQUESTS);
if (pthread_create(&udpserverth, NULL, udpserverrd, NULL))
debugx(1, DBG_ERR, "pthread_create failed");
}
- for (entry = list_first(srvconfs); entry; entry = list_next(entry))
+ for (entry = list_first(srvconfs); entry; entry = list_next(entry)) {
+ addserver((struct clsrvconf *)entry->data);
if (pthread_create(&((struct clsrvconf *)entry->data)->servers->clientth, NULL, clientwr,
(void *)((struct clsrvconf *)entry->data)->servers))
debugx(1, DBG_ERR, "pthread_create failed");
-
+ }
+
if (client_tls_count) {
tcp_server_listen = server_create('T');
return tlslistener();