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)
}
/* 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
/* 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;
}
}
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);
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;
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--;
/* 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;
}
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);
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);
announced. */
void silc_server_announce_clients(SilcServer server,
- unsigned long creation_time)
+ unsigned long creation_time,
+ SilcSocketConnection remote)
{
SilcBuffer clients = NULL;
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);
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;
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);
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);
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,
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);