/*
* Copyright (C) 2006-2009 Stig Venaas <venaas@uninett.no>
- * Copyright (C) 2010, 2011 NORDUnet A/S
+ * Copyright (C) 2010,2011,2012 NORDUnet A/S
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
#include <libgen.h>
#include <pthread.h>
#include <errno.h>
+#include <assert.h>
#include <openssl/ssl.h>
#include <openssl/rand.h>
#include <openssl/err.h>
server = (struct clsrvconf *)entry->data;
if (!server->servers)
return server;
+ if (server->servers->dynfailing)
+ continue;
if (!first)
first = server;
if (!server->servers->connectionok && !server->servers->dynstartup)
pthread_mutex_unlock(&(*realm)->mutex);
freerealm(*realm);
*realm = subrealm;
+ debug(DBG_DBG, "added realm: %s", (*realm)->name);
srvconf = choosesrvconf(acc ? (*realm)->accsrvconfs : (*realm)->srvconfs);
+ debug(DBG_DBG, "found conf for new realm: %s", srvconf->name);
}
}
- if (srvconf)
+ if (srvconf) {
+ debug(DBG_DBG, "found matching conf: %s", srvconf->name);
server = srvconf->servers;
+ }
exit:
free(id);
conf = server->conf;
+#define ZZZ 60
+
if (server->dynamiclookuparg && !dynamicconfig(server)) {
dynconffail = 1;
server->dynstartup = 0;
- sleep(900);
+ server->dynfailing = 1;
+ debug(DBG_WARN, "%s: dynamicconfig(%s) failed, sleeping %ds",
+ __func__, server->conf->name, ZZZ);
+ sleep(ZZZ);
goto errexit;
}
+ /* FIXME: Is resolving not always done by compileserverconfig(),
+ * either as part of static configuration setup or by
+ * dynamicconfig() above? */
if (!resolvehostports(conf->hostports, conf->pdef->socktype)) {
- debug(DBG_WARN, "clientwr: resolve failed");
- server->dynstartup = 0;
- sleep(900);
- goto errexit;
+ debug(DBG_WARN, "%s: resolve failed, sleeping %ds", __func__, ZZZ);
+ sleep(ZZZ);
+ goto errexit;
}
memset(&timeout, 0, sizeof(struct timespec));
if (conf->pdef->connecter) {
if (!conf->pdef->connecter(server, NULL, server->dynamiclookuparg ? 5 : 0, "clientwr")) {
if (server->dynamiclookuparg) {
- server->dynstartup = 0;
- sleep(900);
+ server->dynstartup = 0;
+ server->dynfailing = 1;
+ debug(DBG_WARN, "%s: connect failed, sleeping %ds",
+ __func__, ZZZ);
+ sleep(ZZZ);
}
goto errexit;
}
debug(DBG_ERR, "malloc failed");
continue;
}
+ debug(DBG_DBG, "%s: copying config %s", __func__, conf->name);
*srvconf = *conf;
+ /* Shallow copy -- sharing all the pointers. addserver()
+ * will take care of servers (which btw has to be NUL) but
+ * the rest of them are shared with the config found in
+ * the srvconfs list. */
if (addserver(srvconf)) {
srvconf->servers->dynamiclookuparg = stringcopy(realm->name, 0);
srvconf->servers->dynstartup = 1;
+ debug(DBG_DBG, "%s: new client writer for %s",
+ __func__, srvconf->servers->conf->name);
if (pthread_create(&clientth, NULL, clientwr, (void *)(srvconf->servers))) {
debugerrno(errno, DBG_ERR, "pthread_create failed");
freeserver(srvconf->servers, 1);
}
void freeclsrvconf(struct clsrvconf *conf) {
+ assert(conf);
+ assert(conf->name);
+ debug(DBG_DBG, "%s: freeing %p (%s)", __func__, conf, conf->name);
free(conf->name);
if (conf->hostsrc)
freegconfmstr(conf->hostsrc);
!mergeconfstring(&dst->matchcertattr, &src->matchcertattr) ||
!mergeconfstring(&dst->confrewritein, &src->confrewritein) ||
!mergeconfstring(&dst->confrewriteout, &src->confrewriteout) ||
- !mergeconfstring(&dst->dynamiclookupcommand, &src->dynamiclookupcommand))
+ !mergeconfstring(&dst->confrewriteusername, &src->confrewriteusername) ||
+ !mergeconfstring(&dst->dynamiclookupcommand, &src->dynamiclookupcommand) ||
+ !mergeconfstring(&dst->fticks_viscountry, &src->fticks_viscountry) ||
+ !mergeconfstring(&dst->fticks_visinst, &src->fticks_visinst))
return 0;
if (src->pdef)
dst->pdef = src->pdef;
"rewriteattribute", CONF_STR, &conf->confrewriteusername,
#if defined(WANT_FTICKS)
"fticksVISCOUNTRY", CONF_STR, &conf->fticks_viscountry,
+ "fticksVISINST", CONF_STR, &conf->fticks_visinst,
#endif
NULL
))
#if defined(RADPROT_TLS) || defined(RADPROT_DTLS)
if (conf->type == RAD_TLS || conf->type == RAD_DTLS) {
- conf->tlsconf = conf->tls ? tlsgettls(conf->tls, NULL) : tlsgettls("defaultclient", "default");
+ conf->tlsconf = conf->tls
+ ? tlsgettls(conf->tls, NULL)
+ : tlsgettls("defaultClient", "default");
if (!conf->tlsconf)
debugx(1, DBG_ERR, "error in block %s, no tls context defined", block);
if (conf->matchcertattr && !addmatchcertattr(conf))
conf->confrewritein = rewriteinalias;
else
free(rewriteinalias);
- conf->rewritein = conf->confrewritein ? getrewrite(conf->confrewritein, NULL) : getrewrite("defaultclient", "default");
+ conf->rewritein = conf->confrewritein
+ ? getrewrite(conf->confrewritein, NULL)
+ : getrewrite("defaultClient", "default");
if (conf->confrewriteout)
conf->rewriteout = getrewrite(conf->confrewriteout, NULL);
if (!addhostport(&conf->hostports, conf->hostsrc, conf->pdef->portdefault, 1) ||
!resolvehostports(conf->hostports, conf->pdef->socktype))
- debugx(1, DBG_ERR, "resolve failed, exiting");
+ debugx(1, DBG_ERR, "%s: resolve failed, exiting", __func__);
if (!conf->secret) {
if (!conf->pdef->secretdefault)
int compileserverconfig(struct clsrvconf *conf, const char *block) {
#if defined(RADPROT_TLS) || defined(RADPROT_DTLS)
if (conf->type == RAD_TLS || conf->type == RAD_DTLS) {
- conf->tlsconf = conf->tls ? tlsgettls(conf->tls, NULL) : tlsgettls("defaultserver", "default");
+ conf->tlsconf = conf->tls
+ ? tlsgettls(conf->tls, NULL)
+ : tlsgettls("defaultServer", "default");
if (!conf->tlsconf) {
debug(DBG_ERR, "error in block %s, no tls context defined", block);
return 0;
if (conf->retrycount == 255)
conf->retrycount = conf->pdef->retrycountdefault;
- conf->rewritein = conf->confrewritein ? getrewrite(conf->confrewritein, NULL) : getrewrite("defaultserver", "default");
+ conf->rewritein = conf->confrewritein
+ ? getrewrite(conf->confrewritein, NULL)
+ : getrewrite("defaultServer", "default");
if (conf->confrewriteout)
conf->rewriteout = getrewrite(conf->confrewriteout, NULL);
}
if (!conf->dynamiclookupcommand && !resolvehostports(conf->hostports, conf->pdef->socktype)) {
- debug(DBG_ERR, "resolve failed, exiting");
+ debug(DBG_ERR, "%s: resolve failed", __func__);
return 0;
}
return 1;
if (resconf || !conf->dynamiclookupcommand) {
if (!compileserverconfig(conf, block))
- goto errexit;
+ return 0; /* Don't goto errexit and free resconf -- it's
+ * not ours to free. */
}
if (!conf->secret) {
"ListenDTLS", CONF_MSTR, &listenargs[RAD_DTLS],
"SourceDTLS", CONF_STR, &sourcearg[RAD_DTLS],
#endif
+ "PidFile", CONF_STR, &options.pidfile,
"TTLAttribute", CONF_STR, &options.ttlattr,
"addTTL", CONF_LINT, &addttl,
"LogLevel", CONF_LINT, &loglevel,
debug_timestamp_on();
debug(DBG_INFO, "radsecproxy revision %s starting", PACKAGE_VERSION);
+ if (!pidfile)
+ pidfile = options.pidfile;
if (pidfile && !createpidfile(pidfile))
debugx(1, DBG_ERR, "failed to create pidfile %s: %s", pidfile, strerror(errno));