+ SILC_LOG_DEBUG(("Connection callback %p, status %d, error %d, message %s",
+ conn, status, error, message ? message : "N/A"));
+
+ server->op = NULL;
+
+ switch (status) {
+ case SILC_CLIENT_CONN_SUCCESS:
+ if (server->disconnected) {
+ silc_client_close_connection(client, conn);
+ return;
+ }
+
+ /* We have successfully connected to server */
+
+ /* Enable queueing until we have our requested nick */
+ if (((opt_nickname &&
+ !silc_utf8_strcasecmp(opt_nickname,
+ conn->local_entry->nickname)) ||
+ (settings_get_str("nick") &&
+ !silc_utf8_strcasecmp(settings_get_str("nick"),
+ conn->local_entry->nickname))) &&
+ silc_utf8_strcasecmp(conn->local_entry->nickname,
+ conn->local_entry->username))
+ silc_queue_enable(conn);
+
+ /* Put default attributes */
+ silc_query_attributes_default(silc_client, conn);
+
+ server->connected = TRUE;
+ server->conn = conn;
+ server->conn->context = server;
+ signal_emit("event connected", 1, server);
+ break;
+
+ case SILC_CLIENT_CONN_SUCCESS_RESUME:
+ if (server->disconnected) {
+ silc_client_close_connection(client, conn);
+ return;
+ }
+
+ /* We have successfully resumed old detached session */
+ server->connected = TRUE;
+ server->conn = conn;
+ server->conn->context = server;
+ signal_emit("event connected", 1, server);
+
+ /* Put default attributes */
+ silc_query_attributes_default(silc_client, conn);
+
+ /* Remove the detach data now */
+ file = silc_get_session_filename(server);
+ unlink(file);
+ silc_free(file);
+ break;
+
+ case SILC_CLIENT_CONN_DISCONNECTED:
+ /* Server disconnected */
+ if (server->conn && server->conn->local_entry) {
+ nicklist_rename_unique(SERVER(server),
+ server->conn->local_entry, server->nick,
+ server->conn->local_entry,
+ silc_client->username);
+ silc_change_nick(server, silc_client->username);
+ }
+
+ if (message)
+ silc_say(client, conn, SILC_CLIENT_MESSAGE_AUDIT,
+ "Server closed connection: %s (%d) %s",
+ silc_get_status_message(error), error,
+ message ? message : "");
+
+ /* Close FTP sessions */
+ silc_dlist_start(server->ftp_sessions);
+ while ((ftp = silc_dlist_get(server->ftp_sessions)))
+ silc_client_file_close(client, conn, ftp->session_id);
+ silc_dlist_uninit(server->ftp_sessions);
+
+ if (server->conn)
+ server->conn->context = NULL;
+ server->conn = NULL;
+ server->connection_lost = TRUE;
+ if (!server->disconnected)
+ server_disconnect(SERVER(server));
+ server_unref(SERVER(server));
+ break;
+
+ default:
+ file = silc_get_session_filename(server);
+ if (silc_file_size(file) > 0)
+ printformat_module("fe-common/silc", server, NULL,
+ MSGLEVEL_CRAP, SILCTXT_REATTACH_FAILED, file);
+ silc_free(file);
+
+ server->connection_lost = TRUE;
+ server->conn = NULL;
+ if (server->conn)
+ server->conn->context = NULL;
+ if (!server->disconnected)
+ server_disconnect(SERVER(server));
+ server_unref(SERVER(server));
+ break;
+ }
+}
+
+/* Called after TCP stream has been created */
+
+static void sig_connected_stream_created(SilcSocketStreamStatus status,
+ SilcStream stream, void *context)
+{
+ SILC_SERVER_REC *server = context;
+ SilcClientConnectionParams params;
+ char *file;
+
+ server->tcp_op = NULL;
+ if (!stream) {
+ server->connection_lost = TRUE;
+ server_disconnect(SERVER(server));
+ return;
+ }
+
+ if (server->disconnected) {
+ silc_stream_destroy(stream);