X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fserver.c;h=05323399eda32a43a8612d13898fbf6f42f15bef;hb=33b943ac6034b92fcc5c09802f9fe9add12a51c9;hp=2e85203df1d7335de7d244086c677cfb91a385b4;hpb=e5d8d3db6caa344b3d419b884556c21b15e7d123;p=silc.git diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 2e85203d..05323399 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -912,20 +912,23 @@ SILC_TASK_CALLBACK(silc_server_connect_to_router_final) server->id_entry->router = id_entry; server->router = id_entry; server->standalone = FALSE; - } - /* If we are router then announce our possible servers. */ - if (server->server_type == SILC_ROUTER) - silc_server_announce_servers(server, FALSE, 0); + /* If we are router then announce our possible servers. */ + if (server->server_type == SILC_ROUTER) + silc_server_announce_servers(server, FALSE, 0, + server->router->connection); - /* Announce our clients and channels to the router */ - silc_server_announce_clients(server, 0); - silc_server_announce_channels(server, 0); + /* Announce our clients and channels to the router */ + silc_server_announce_clients(server, 0, server->router->connection); + silc_server_announce_channels(server, 0, server->router->connection); + } } else { /* Add this server to be our backup router */ silc_server_backup_add(server, id_entry, FALSE); } + sock->protocol = NULL; + /* Call the completion callback to indicate that we've connected to the router */ if (sconn->callback) @@ -939,13 +942,14 @@ SILC_TASK_CALLBACK(silc_server_connect_to_router_final) } /* Free the protocol object */ + if (sock->protocol == protocol) + sock->protocol = NULL; silc_protocol_free(protocol); if (ctx->packet) silc_packet_context_free(ctx->packet); if (ctx->ske) silc_ske_free(ctx->ske); silc_free(ctx); - sock->protocol = NULL; } /* Host lookup callbcak that is called after the incoming connection's @@ -1343,7 +1347,7 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection_final) /* Change it back to SERVER type since that's what it really is. */ if (conn->backup_local) { ctx->conn_type = SILC_SOCKET_TYPE_SERVER; - new_server->server_type = SILC_SOCKET_TYPE_SERVER; + new_server->server_type = SILC_BACKUP_ROUTER; } } @@ -1591,10 +1595,6 @@ SILC_TASK_CALLBACK(silc_server_packet_parse_real) goto out; } - /* If entry is disabled ignore what we got. */ - if (idata && idata->status & SILC_IDLIST_STATUS_DISABLED) - goto out; - if (ret == 0) { /* Parse the packet. Packet type is returned. */ ret = silc_packet_parse(packet); @@ -1604,6 +1604,11 @@ SILC_TASK_CALLBACK(silc_server_packet_parse_real) ret = silc_packet_parse_special(packet); } + /* If entry is disabled ignore what we got. */ + if (ret != SILC_PACKET_RESUME_ROUTER && + idata && idata->status & SILC_IDLIST_STATUS_DISABLED) + goto out; + if (ret == SILC_PACKET_NONE) goto out; @@ -2360,13 +2365,12 @@ void silc_server_free_sock_user_data(SilcServer server, router. This also removes the clients that *really* was owned by the primary router and went down with the router. */ silc_server_update_clients_by_server(server, user_data, backup_router, - TRUE); + TRUE, TRUE); } /* Free the server entry */ silc_server_backup_del(server, user_data); - if (user_data->id) - silc_server_backup_replaced_del(server, user_data->id); + silc_server_backup_replaced_del(server, user_data); silc_idlist_del_data(user_data); silc_idlist_del_server(server->local_list, user_data); server->stat.my_servers--; @@ -2378,11 +2382,25 @@ void silc_server_free_sock_user_data(SilcServer server, /* Announce all of our stuff that was created about 5 minutes ago. The backup router knows all the other stuff already. */ if (server->server_type == SILC_ROUTER) - silc_server_announce_servers(server, FALSE, time(0) - 300); + silc_server_announce_servers(server, FALSE, 0, + server->router->connection); /* Announce our clients and channels to the router */ - silc_server_announce_clients(server, time(0) - 300); - silc_server_announce_channels(server, time(0) - 300); + silc_server_announce_clients(server, 0, + server->router->connection); + silc_server_announce_channels(server, 0, + server->router->connection); +#if 0 + if (server->server_type == SILC_ROUTER) + silc_server_announce_servers(server, FALSE, time(0) - 300, + server->router->connection); + + /* Announce our clients and channels to the router */ + silc_server_announce_clients(server, time(0) - 300, + server->router->connection); + silc_server_announce_channels(server, time(0) - 300, + server->router->connection); +#endif } break; } @@ -3076,20 +3094,21 @@ static void silc_server_announce_get_servers(SilcServer server, will be announced. */ void silc_server_announce_servers(SilcServer server, bool global, - unsigned long creation_time) + unsigned long creation_time, + SilcSocketConnection remote) { SilcBuffer servers = NULL; SILC_LOG_DEBUG(("Announcing servers")); /* Get servers in local list */ - silc_server_announce_get_servers(server, server->router, + silc_server_announce_get_servers(server, remote->user_data, server->local_list, &servers, creation_time); if (global) /* Get servers in global list */ - silc_server_announce_get_servers(server, server->router, + silc_server_announce_get_servers(server, remote->user_data, server->global_list, &servers, creation_time); @@ -3098,7 +3117,7 @@ void silc_server_announce_servers(SilcServer server, bool global, SILC_LOG_HEXDUMP(("servers"), servers->data, servers->len); /* Send the packet */ - silc_server_packet_send(server, server->router->connection, + silc_server_packet_send(server, remote, SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST, servers->data, servers->len, TRUE); @@ -3157,7 +3176,8 @@ static void silc_server_announce_get_clients(SilcServer server, announced. */ void silc_server_announce_clients(SilcServer server, - unsigned long creation_time) + unsigned long creation_time, + SilcSocketConnection remote) { SilcBuffer clients = NULL; @@ -3177,7 +3197,7 @@ void silc_server_announce_clients(SilcServer server, SILC_LOG_HEXDUMP(("clients"), clients->data, clients->len); /* Send the packet */ - silc_server_packet_send(server, server->router->connection, + silc_server_packet_send(server, remote, SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST, clients->data, clients->len, TRUE); @@ -3352,7 +3372,8 @@ void silc_server_announce_get_channels(SilcServer server, was provided. */ void silc_server_announce_channels(SilcServer server, - unsigned long creation_time) + unsigned long creation_time, + SilcSocketConnection remote) { SilcBuffer channels = NULL, channel_users = NULL; SilcBuffer *channel_users_modes = NULL; @@ -3380,7 +3401,7 @@ void silc_server_announce_channels(SilcServer server, SILC_LOG_HEXDUMP(("channels"), channels->data, channels->len); /* Send the packet */ - silc_server_packet_send(server, server->router->connection, + silc_server_packet_send(server, remote, SILC_PACKET_NEW_CHANNEL, SILC_PACKET_FLAG_LIST, channels->data, channels->len, FALSE); @@ -3394,7 +3415,7 @@ void silc_server_announce_channels(SilcServer server, channel_users->len); /* Send the packet */ - silc_server_packet_send(server, server->router->connection, + silc_server_packet_send(server, remote, SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST, channel_users->data, channel_users->len, FALSE); @@ -3411,7 +3432,7 @@ void silc_server_announce_channels(SilcServer server, channel_users_modes[i]->head); SILC_LOG_HEXDUMP(("channel users modes"), channel_users_modes[i]->data, channel_users_modes[i]->len); - silc_server_packet_send_dest(server, server->router->connection, + silc_server_packet_send_dest(server, remote, SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST, channel_ids[i], SILC_ID_CHANNEL, channel_users_modes[i]->data, @@ -3795,7 +3816,7 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final) SILC_LOG_DEBUG(("Start")); if (protocol->state == SILC_PROTOCOL_STATE_ERROR || - protocol->state == SILC_PROTOCOL_STATE_FAILURE) { + protocol->state == SILC_PROTOCOL_STATE_FAILURE) { /* Error occured during protocol */ SILC_LOG_ERROR(("Error occurred during rekey protocol")); silc_protocol_cancel(protocol, server->schedule);