Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 2005, 2007 Pekka Riikonen
+ Copyright (C) 1997 - 2009 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
silc_server_remove_from_channels(server, NULL, client, TRUE,
NULL, TRUE, FALSE);
+ silc_dlist_del(server->expired_clients, client);
silc_idlist_del_data(client);
silc_idlist_del_client(server->global_list, client);
}
client->data.status &= ~SILC_IDLIST_STATUS_RESOLVING;
client->mode = mode;
client->servername = servername[0] ? strdup(servername) : NULL;
+
+ SILC_LOG_DEBUG(("stat.clients %d->%d", server->stat.clients,
+ server->stat.clients + 1));
+ server->stat.clients++;
} else {
/* We have the client already, update the data */
return FALSE;
}
- /* Remove the old cache entry */
- silc_idcache_del_by_context(global ? server->global_list->clients :
- server->local_list->clients, client, NULL);
+ /* Update entry */
+ silc_idcache_update_by_context(global ? server->global_list->clients :
+ server->local_list->clients, client, NULL,
+ nickname, TRUE);
silc_free(client->nickname);
silc_free(client->username);
client->mode = mode;
client->data.status |= SILC_IDLIST_STATUS_RESOLVED;
client->data.status &= ~SILC_IDLIST_STATUS_RESOLVING;
-
- /* Create new cache entry */
- silc_idcache_add(global ? server->global_list->clients :
- server->local_list->clients, nickname, client->id,
- client);
}
/* Save channel list if it was sent to us */
if (!nickname) {
SILC_LOG_ERROR(("Malformed nickname '%s' received in WHOWAS reply "
"from %s",
- hostname ? hostname : "", nick));
+ nick, hostname ? hostname : ""));
return FALSE;
}
client->servername = servername[0] ? strdup(servername) : NULL;
client->data.status |= SILC_IDLIST_STATUS_RESOLVED;
client->data.status &= ~SILC_IDLIST_STATUS_RESOLVING;
+ client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
- /* Remove the old cache entry and create a new one */
- silc_idcache_del_by_context(global ? server->global_list->clients :
- server->local_list->clients, client, NULL);
- silc_idcache_add(global ? server->global_list->clients :
- server->local_list->clients, nickname, client->id,
- client);
+ /* Update cache entry */
+ silc_idcache_update_by_context(global ? server->global_list->clients :
+ server->local_list->clients, client, NULL,
+ nickname, TRUE);
}
/* If client is global and is not on any channel then add that we'll
expire the entry after a while. */
if (global) {
- silc_idlist_find_client_by_id(server->global_list, client->id,
- FALSE, &cache);
- if (!silc_hash_table_count(client->channels))
+ client = silc_idlist_find_client_by_id(server->global_list, client->id,
+ FALSE, &cache);
+ if (client && !silc_hash_table_count(client->channels)) {
+ client->data.created = silc_time();
+ silc_dlist_del(server->expired_clients, client);
silc_dlist_add(server->expired_clients, client);
+ }
}
return TRUE;
char *name, *info;
SilcClientID client_id;
SilcServerID server_id;
- SilcChannelID*channel_id;
+ SilcChannelID channel_id;
SilcClientEntry client;
SilcServerEntry server_entry;
SilcChannelEntry channel;
to global list since server didn't have it in the lists so it must be
global. */
client = silc_idlist_add_client(server->global_list,
- nick[0] ? nick : NULL, info, NULL,
+ nick[0] ? strdup(nick) : NULL,
+ info ? strdup(info) : NULL, NULL,
silc_id_dup(&client_id, SILC_ID_CLIENT),
silc_packet_get_context(cmd->sock),
NULL);
client->data.status |= SILC_IDLIST_STATUS_REGISTERED;
client->data.status |= SILC_IDLIST_STATUS_RESOLVED;
client->data.status &= ~SILC_IDLIST_STATUS_RESOLVING;
+
+ SILC_LOG_DEBUG(("stat.clients %d->%d", server->stat.clients,
+ server->stat.clients + 1));
+ server->stat.clients++;
} else {
/* We have the client already, update the data */
return FALSE;
}
- /* Remove the old cache entry */
- silc_idcache_del_by_context(global ? server->global_list->clients :
- server->local_list->clients, client, NULL);
-
silc_free(client->nickname);
client->nickname = strdup(nick);
- /* Add new cache entry */
- silc_idcache_add(global ? server->global_list->clients :
- server->local_list->clients, name, client->id,
- client);
+ /* Update the context */
+ silc_idcache_update_by_context(global ? server->global_list->clients :
+ server->local_list->clients, client,
+ NULL, name, TRUE);
}
if (info) {
silc_hmac_free(hmac);
silc_server_command_reply_free(cmd);
- silc_pkcs_public_key_free(founder_key);
+ if (founder_key)
+ silc_pkcs_public_key_free(founder_key);
if (client_id_list)
silc_buffer_free(client_id_list);
if (client_mode_list)
SILC_STR_END);
}
+ SILC_LOG_DEBUG(("stat.clients = %d", server->stat.clients));
+
out:
SILC_SERVER_PENDING_EXEC(cmd, SILC_COMMAND_STATS);
err:
if (!channel) {
SilcBuffer idp;
- if (server->server_type != SILC_SERVER)
+ if (cmd->pending || server->server_type != SILC_SERVER)
goto out;
idp = silc_id_payload_encode(SILC_ID_GET_ID(id), SILC_ID_CHANNEL);
silc_server_command_pending(server, SILC_COMMAND_IDENTIFY,
server->cmd_ident,
silc_server_command_reply_users, cmd);
+
+ cmd->pending = TRUE;
return;
}
}