From: Pekka Riikonen Date: Tue, 21 Jan 2003 18:12:49 +0000 (+0000) Subject: Send DISCONNECT in close command. X-Git-Tag: silc.server.0.9.12~6 X-Git-Url: http://git.silcnet.org/gitweb/?a=commitdiff_plain;h=1b737b330784b5ad0f72d8d5a721129dbc450d23;p=silc.git Send DISCONNECT in close command. Better check whether we are connecting to remote router before reconnecting. --- diff --git a/CHANGES b/CHANGES index 1389e250..46d392bf 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,12 @@ +Tue Jan 21 17:18:04 EET 2003 Pekka Riikonen + + * Send DISCONNECT in close admin command in server. Affected + file silcd/command.c. + + * Check whether we are already connecting to a remote router + (in addition of checking whether we are already connected) + before creating new connection. Affected file silcd/server.c. + Thu Jan 16 18:47:00 EET 2003 Pekka Riikonen * Added better compiler and compiler flags checking in diff --git a/apps/silcd/command.c b/apps/silcd/command.c index 6861d136..1afc4344 100644 --- a/apps/silcd/command.c +++ b/apps/silcd/command.c @@ -4772,17 +4772,19 @@ SILC_SERVER_CMD_FUNC(close) /* Close the connection to the server */ sock = (SilcSocketConnection)server_entry->connection; - /* If we shutdown primary router connection manually then don't trigger - any reconnect or backup router connections, by setting the router - to NULL here. */ + server->backup_noswitch = TRUE; if (server->router == server_entry) { server->id_entry->router = NULL; server->router = NULL; server->standalone = TRUE; } - silc_server_free_sock_user_data(server, sock, NULL); - silc_server_close_connection(server, sock); - + silc_server_disconnect_remote(server, sock, + SILC_STATUS_ERR_BANNED_FROM_SERVER, + "Closed by administrator"); + if (sock->user_data) + silc_server_free_sock_user_data(server, sock, NULL); + server->backup_noswitch = FALSE; + out: silc_server_command_free(cmd); } diff --git a/apps/silcd/packet_receive.c b/apps/silcd/packet_receive.c index e49fafb5..ee45290f 100644 --- a/apps/silcd/packet_receive.c +++ b/apps/silcd/packet_receive.c @@ -2164,6 +2164,16 @@ SilcClientEntry silc_server_new_client(SilcServer server, return NULL; } + /* Make sure this client hasn't registered already */ + if (idata->status & SILC_IDLIST_STATUS_REGISTERED) { + silc_server_disconnect_remote(server, sock, + SILC_STATUS_ERR_OPERATION_ALLOWED, + "Too many registrations"); + if (sock->user_data) + silc_server_free_sock_user_data(server, sock, NULL); + return NULL; + } + /* Parse incoming packet */ ret = silc_buffer_unformat(buffer, SILC_STR_UI16_NSTRING_ALLOC(&username, @@ -2413,6 +2423,16 @@ SilcServerEntry silc_server_new_server(SilcServer server, local = FALSE; } + /* Make sure this server hasn't registered already */ + if (idata->status & SILC_IDLIST_STATUS_REGISTERED) { + silc_server_disconnect_remote(server, sock, + SILC_STATUS_ERR_OPERATION_ALLOWED, + "Too many registrations"); + if (sock->user_data) + silc_server_free_sock_user_data(server, sock, NULL); + return NULL; + } + /* Parse the incoming packet */ ret = silc_buffer_unformat(buffer, SILC_STR_UI16_NSTRING_ALLOC(&id_string, &id_len), @@ -2474,19 +2494,38 @@ SilcServerEntry silc_server_new_server(SilcServer server, server_entry = silc_idlist_find_server_by_id(server->local_list, server_id, TRUE, NULL); if (server_entry) { - silc_idcache_del_by_context(server->local_list->servers, server_entry); + if (SILC_IS_LOCAL(server_entry)) { + silc_server_disconnect_remote(server, server_entry->connection, + SILC_STATUS_ERR_OPERATION_ALLOWED, + "Too many registrations"); + if (((SilcSocketConnection)server_entry->connection)->user_data) + silc_server_free_sock_user_data(server, sock, NULL); + } else { + silc_idcache_del_by_context(server->local_list->servers, server_entry); + } } else { server_entry = silc_idlist_find_server_by_id(server->global_list, server_id, TRUE, NULL); - if (server_entry) - silc_idcache_del_by_context(server->global_list->servers, server_entry); + if (server_entry) { + if (SILC_IS_LOCAL(server_entry)) { + silc_server_disconnect_remote(server, server_entry->connection, + SILC_STATUS_ERR_OPERATION_ALLOWED, + "Too many registrations"); + if (((SilcSocketConnection)server_entry->connection)->user_data) + silc_server_free_sock_user_data(server, server_entry->connection, + NULL); + } else { + silc_idcache_del_by_context(server->global_list->servers, + server_entry); + } + } } /* Update server entry */ idata->status |= SILC_IDLIST_STATUS_REGISTERED; new_server->server_name = server_name; new_server->id = server_id; - + SILC_LOG_DEBUG(("New server id(%s)", silc_id_render(server_id, SILC_ID_SERVER))); diff --git a/apps/silcd/server.c b/apps/silcd/server.c index f1f93da0..59e6c439 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -430,11 +430,7 @@ bool silc_server_init(SilcServer server) timeout. It expires as soon as the caller calls silc_server_run. This task performs authentication protocol and key exchange with our primary router. */ - silc_schedule_task_add(server->schedule, 0, - silc_server_connect_to_router, - (void *)server, 0, 1, - SILC_TASK_TIMEOUT, - SILC_TASK_PRI_NORMAL); + silc_server_create_connections(server); /* Add listener task to the scheduler. This task receives new connections to the server. This task remains on the queue until the end of the @@ -695,12 +691,8 @@ bool silc_server_rehash(SilcServer server) } } - /* Go through all configured routers after rehash */ - silc_schedule_task_add(server->schedule, 0, - silc_server_connect_to_router, - (void *)server, 0, 1, - SILC_TASK_TIMEOUT, - SILC_TASK_PRI_NORMAL); + /* Create connections after rehash */ + silc_server_create_connections(server); /* Check whether our router status has changed */ if (newconfig->servers) { @@ -1047,7 +1039,7 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_connect_to_router) server->wait_backup = TRUE; if (ptr->initiator) { - /* Check whether we are connected to this host already */ + /* Check whether we are connecting or connected to this host already */ if (silc_server_num_sockets_by_remote(server, silc_net_is_ip(ptr->host) ? ptr->host : NULL, @@ -1057,6 +1049,15 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_connect_to_router) SILC_LOG_DEBUG(("We are already connected to this router")); continue; } + if (silc_server_num_sockets_by_remote(server, + silc_net_is_ip(ptr->host) ? + ptr->host : NULL, + silc_net_is_ip(ptr->host) ? + NULL : ptr->host, ptr->port, + SILC_SOCKET_TYPE_UNKNOWN)) { + SILC_LOG_DEBUG(("We are already connecting to this router")); + continue; + } /* Allocate connection object for hold connection specific stuff. */ sconn = silc_calloc(1, sizeof(*sconn)); @@ -2239,12 +2240,9 @@ SILC_TASK_CALLBACK(silc_server_packet_process) else silc_server_free_sock_user_data(server, sock, NULL); } else if (server->router_conn && server->router_conn->sock == sock && - !server->router && server->standalone) - silc_schedule_task_add(server->schedule, 0, - silc_server_connect_to_router, - server, 1, 0, - SILC_TASK_TIMEOUT, - SILC_TASK_PRI_NORMAL); + !server->router && server->standalone) { + silc_server_create_connections(server); + } silc_server_close_connection(server, sock); return; @@ -2503,11 +2501,15 @@ void silc_server_packet_parse_type(SilcServer server, message ? message : "")); silc_free(message); + /* Do not switch to backup in case of error */ + server->backup_noswitch = (status == SILC_STATUS_OK ? FALSE : TRUE); + /* Handle the disconnection from our end too */ SILC_SET_DISCONNECTING(sock); if (sock->user_data && SILC_IS_LOCAL(sock->user_data)) silc_server_free_sock_user_data(server, sock, NULL); silc_server_close_connection(server, sock); + server->backup_noswitch = FALSE; } break; @@ -3162,12 +3164,7 @@ void silc_server_free_sock_user_data(SilcServer server, if (server->router == user_data) { /* Check whether we have a backup router connection */ if (!backup_router || backup_router == user_data) { - silc_schedule_task_add(server->schedule, 0, - silc_server_connect_to_router, - server, 1, 0, - SILC_TASK_TIMEOUT, - SILC_TASK_PRI_NORMAL); - + silc_server_create_connections(server); server->id_entry->router = NULL; server->router = NULL; server->standalone = TRUE; @@ -3215,15 +3212,12 @@ void silc_server_free_sock_user_data(SilcServer server, } else if (server->server_type == SILC_SERVER && sock->type == SILC_SOCKET_TYPE_ROUTER) { /* Reconnect to the router (backup) */ - silc_schedule_task_add(server->schedule, 0, - silc_server_connect_to_router, - server, 1, 0, - SILC_TASK_TIMEOUT, - SILC_TASK_PRI_NORMAL); + silc_server_create_connections(server); } - SILC_SERVER_SEND_OPERS(server, FALSE, TRUE, SILC_NOTIFY_TYPE_NONE, - ("Server %s signoff", user_data->server_name)); + if (user_data->server_name) + SILC_SERVER_SEND_OPERS(server, FALSE, TRUE, SILC_NOTIFY_TYPE_NONE, + ("Server %s signoff", user_data->server_name)); if (!backup_router) { /* Remove all servers that are originated from this server, and @@ -5089,12 +5083,7 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final) if (sock->user_data) silc_server_free_sock_user_data(server, sock, NULL); silc_server_close_connection(server, sock); - silc_schedule_task_add(server->schedule, 0, - silc_server_connect_to_router, - server, 1, 0, - SILC_TASK_TIMEOUT, - SILC_TASK_PRI_NORMAL); - + silc_server_create_connections(server); return; } diff --git a/apps/silcd/server_backup.c b/apps/silcd/server_backup.c index 832ecb3a..f91a6d29 100644 --- a/apps/silcd/server_backup.c +++ b/apps/silcd/server_backup.c @@ -1054,6 +1054,8 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_protocol_backup) SILC_LOG_DEBUG(("Sending RESUMED to %s", server_entry->server_name)); + SILC_LOG_INFO(("Sending RESUMED to %s", + server_entry->server_name)); server_entry->data.status &= ~SILC_IDLIST_STATUS_DISABLED; @@ -1091,6 +1093,8 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_protocol_backup) SILC_LOG_DEBUG(("Sending RESUMED to %s", server_entry->server_name)); + SILC_LOG_INFO(("Sending RESUMED to %s", + server_entry->server_name)); server_entry->data.status &= ~SILC_IDLIST_STATUS_DISABLED; @@ -1263,12 +1267,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_backup_done) if (sock->user_data) silc_server_free_sock_user_data(server, sock, NULL); silc_server_close_connection(server, sock); - - silc_schedule_task_add(server->schedule, 0, - silc_server_connect_to_router, - server, 1, 0, - SILC_TASK_TIMEOUT, - SILC_TASK_PRI_NORMAL); + silc_server_create_connections(server); if (!silc_idcache_list_next(list, &id_cache)) break; @@ -1308,12 +1307,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_backup_done) if (sock->user_data) silc_server_free_sock_user_data(server, sock, NULL); silc_server_close_connection(server, sock); - - silc_schedule_task_add(server->schedule, 0, - silc_server_connect_to_router, - server, 1, 0, - SILC_TASK_TIMEOUT, - SILC_TASK_PRI_NORMAL); + silc_server_create_connections(server); if (!silc_idcache_list_next(list, &id_cache)) break; diff --git a/apps/silcd/server_util.c b/apps/silcd/server_util.c index dead873a..064975bd 100644 --- a/apps/silcd/server_util.c +++ b/apps/silcd/server_util.c @@ -1947,3 +1947,14 @@ void silc_server_inviteban_destruct(void *key, void *context, break; } } + +/* Creates connections accoring to configuration. */ + +void silc_server_create_connections(SilcServer server) +{ + silc_schedule_task_del_by_callback(server->schedule, + silc_server_connect_to_router); + silc_schedule_task_add(server->schedule, 0, + silc_server_connect_to_router, server, 0, 1, + SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL); +} diff --git a/apps/silcd/server_util.h b/apps/silcd/server_util.h index 393f0900..489abf87 100644 --- a/apps/silcd/server_util.h +++ b/apps/silcd/server_util.h @@ -207,4 +207,7 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list, void silc_server_inviteban_destruct(void *key, void *context, void *user_context); +/* Creates connections accoring to configuration. */ +void silc_server_create_connections(SilcServer server); + #endif /* SERVER_UTIL_H */