+ *minor = 0;
+ return GSS_S_COMPLETE;
+}
+
+/*
+ * Allocate a RadSec handle
+ */
+static OM_uint32
+createRadiusHandle(OM_uint32 *minor,
+ gss_cred_id_t cred,
+ gss_ctx_id_t ctx)
+{
+ struct gss_eap_acceptor_ctx *actx = &ctx->acceptorCtx;
+ const char *configFile = RS_CONFIG_FILE;
+ const char *configStanza = "gss-eap";
+ struct rs_alloc_scheme ralloc;
+ struct rs_error *err;
+
+ assert(actx->radContext == NULL);
+ assert(actx->radConn == NULL);
+
+ if (rs_context_create(&actx->radContext, RS_DICT_FILE) != 0) {
+ *minor = GSSEAP_RADSEC_CONTEXT_FAILURE;
+ return GSS_S_FAILURE;
+ }
+
+ if (cred != GSS_C_NO_CREDENTIAL) {
+ if (cred->radiusConfigFile != NULL)
+ configFile = cred->radiusConfigFile;
+ if (cred->radiusConfigStanza != NULL)
+ configStanza = cred->radiusConfigStanza;
+ }
+
+ ralloc.calloc = GSSEAP_CALLOC;
+ ralloc.malloc = GSSEAP_MALLOC;
+ ralloc.free = GSSEAP_FREE;
+ ralloc.realloc = GSSEAP_REALLOC;
+
+ rs_context_set_alloc_scheme(actx->radContext, &ralloc);
+
+ if (rs_context_read_config(actx->radContext, configFile) != 0) {
+ err = rs_err_ctx_pop(actx->radContext);
+ goto fail;
+ }
+
+ if (rs_conn_create(actx->radContext, &actx->radConn, configStanza) != 0) {
+ err = rs_err_conn_pop(actx->radConn);
+ goto fail;
+ }
+
+ if (actx->radServer != NULL) {
+ if (rs_conn_select_server(actx->radConn, actx->radServer) != 0) {
+ err = rs_err_conn_pop(actx->radConn);
+ goto fail;
+ }
+ }
+
+ *minor = 0;