SilcConnAuth silc_connauth_alloc(SilcSchedule schedule, SilcSKE ske, SilcUInt32 timeout_secs) { SilcConnAuth connauth; if (!schedule || !ske) return NULL; connauth = silc_calloc(1, sizeof(*connauth)); if (!connauth) return NULL; connauth->fsm = silc_fsm_alloc(connauth, silc_connauth_fsm_destructor, NULL, schedule); if (!connauth->fsm) { silc_connauth_free(connauth); return NULL; } connauth->timeout_secs = timeout_secs; connauth->ske = ske; ske->refcnt++; return connauth; }
static void silc_server_accept_free(SilcServerAccept ac) { if (ac->connauth) silc_connauth_free(ac->connauth); silc_free(ac->error_string); silc_free(ac); }
static void silc_client_connect_auth_completion(SilcConnAuth connauth, SilcBool success, void *context) { SilcFSMThread fsm = context; SilcClientConnection conn = silc_fsm_get_context(fsm); SilcClient client = conn->client; conn->internal->op = NULL; silc_connauth_free(connauth); if (!success) { if (conn->internal->verbose) client->internal->ops->say( client, conn, SILC_CLIENT_MESSAGE_ERROR, "Authentication failed"); conn->internal->status = SILC_CLIENT_CONN_ERROR_AUTH; conn->internal->error = SILC_STATUS_ERR_AUTH_FAILED; silc_fsm_next(fsm, silc_client_st_connect_error); } SILC_FSM_CALL_CONTINUE_SYNC(fsm); }