Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 2007 Pekka Riikonen
+ Copyright (C) 1997 - 2014 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
SilcClient client = silc_fsm_get_state_context(fsm);
/* Signal client that we have finished */
- silc_atomic_sub_int16(&client->internal->conns, 1);
+ silc_atomic_sub_int32(&client->internal->conns, 1);
client->internal->connection_closed = TRUE;
SILC_FSM_EVENT_SIGNAL(&client->internal->wait_event);
{
SilcClientConnection conn = fsm_context;
SilcClientCommandContext cmd;
+ SilcList list;
+ SilcIDCacheEntry entry;
+ SilcClientEntry client_entry;
/* Finish running command threads. This will also finish waiting packet
thread, as they are always waiting for some command. If any thread is
conn->internal->op = NULL;
}
+ /* Abort ongoing client entry operations */
+ if (conn->internal->client_cache) {
+ if (silc_idcache_get_all(conn->internal->client_cache, &list)) {
+ silc_list_start(list);
+ while ((entry = silc_list_get(list))) {
+ client_entry = entry->context;
+ if (client_entry->internal.op) {
+ silc_async_abort(client_entry->internal.op, NULL, NULL);
+ client_entry->internal.op = NULL;
+ }
+ }
+ }
+ }
+
/* If event thread is running, finish it. */
if (silc_fsm_is_started(&conn->internal->event_thread)) {
SILC_LOG_DEBUG(("Finish event thread"));
msg = silc_memdup(silc_buffer_data(&packet->buffer),
silc_buffer_len(&packet->buffer));
if (msg)
- client->internal->ops->say(client, conn, SILC_CLIENT_MESSAGE_AUDIT, msg);
+ client->internal->ops->say(client, conn, SILC_CLIENT_MESSAGE_ERROR, msg);
silc_free(msg);
silc_packet_free(packet);
/* A connection finished */
SILC_LOG_DEBUG(("Event: connection closed"));
client->internal->connection_closed = FALSE;
- if (silc_atomic_get_int16(&client->internal->conns) == 0 &&
+ if (silc_atomic_get_int32(&client->internal->conns) == 0 &&
client->internal->stop)
SILC_FSM_EVENT_SIGNAL(&client->internal->wait_event);
return SILC_FSM_CONTINUE;
if (client->internal->stop) {
/* Stop client libarry. If we have running connections, wait until
they finish first. */
- if (silc_atomic_get_int16(&client->internal->conns) == 0) {
+ if (silc_atomic_get_int32(&client->internal->conns) == 0) {
SILC_LOG_DEBUG(("Event: stop"));
silc_fsm_next(fsm, silc_client_st_stop);
}
}
/* Set parameters */
- if (params)
+ if (params) {
conn->internal->params = *params;
+ conn->context = params->context;
+ }
if (!conn->internal->params.rekey_secs)
conn->internal->params.rekey_secs = 3600;
#ifndef SILC_DIST_INPLACE
silc_fsm_start(thread, silc_client_connection_st_start);
SILC_LOG_DEBUG(("New connection %p", conn));
- silc_atomic_add_int16(&client->internal->conns, 1);
+ silc_atomic_add_int32(&client->internal->conns, 1);
return conn;
}
SILC_LOG_DEBUG(("Connecting to server"));
- if (!client || !remote_host)
+ if (!client || !remote_host || !callback)
return NULL;
if (client->internal->run_callback) {
SILC_LOG_DEBUG(("Connecting to client"));
- if (!client || !remote_host)
+ if (!client || !remote_host || !callback)
return NULL;
if (client->internal->run_callback) {
SILC_LOG_DEBUG(("Performing key exchange"));
- if (!client || !stream)
+ if (!client || !stream || !callback)
return NULL;
if (client->internal->run_callback) {
nickname_format[sizeof(new_client->internal->
params->nickname_format) - 1] = 0;
- silc_atomic_init16(&new_client->internal->conns, 0);
+ silc_atomic_init32(&new_client->internal->conns, 0);
return new_client;
}
silc_dlist_uninit(client->internal->ftp_sessions);
if (client->internal->lock)
silc_mutex_free(client->internal->lock);
- silc_atomic_uninit16(&client->internal->conns);
+ silc_atomic_uninit32(&client->internal->conns);
silc_free(client->username);
silc_free(client->hostname);
silc_free(client->realname);