+ 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);
+ return;
+ }
+
+ /* Set connection parameters */
+ memset(¶ms, 0, sizeof(params));
+ params.nickname = (opt_nickname ? (char *)opt_nickname :
+ (char *)settings_get_str("nick"));
+ params.timeout_secs = settings_get_int("key_exchange_timeout_secs");
+ params.rekey_secs = settings_get_int("key_exchange_rekey_secs");
+ params.pfs = settings_get_bool("key_exchange_rekey_pfs");
+
+ /* Try to read detached session data and use it if found. */
+ file = silc_get_session_filename(server);
+ params.detach_data = silc_file_readfile(file, ¶ms.detach_data_len);
+ if (params.detach_data)
+ params.detach_data[params.detach_data_len] = 0;
+ if (params.detach_data)
+ printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
+ SILCTXT_REATTACH, server->tag);
+ silc_free(file);
+
+ /* Start key exchange */
+ server->op = silc_client_key_exchange(silc_client, ¶ms,
+ irssi_pubkey, irssi_privkey,
+ stream, SILC_CONN_SERVER,
+ silc_connect_cb, server);
+ if (!server->op) {
+ server->connection_lost = TRUE;
+ server_disconnect(SERVER(server));
+ silc_stream_destroy(stream);
+ return;
+ }