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;
/* Update cache entry */
silc_idcache_update_by_context(global ? server->global_list->clients :
/* 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)) {
+ silc_dlist_del(server->expired_clients, client);
silc_dlist_add(server->expired_clients, client);
+ }
}
return TRUE;
int ret;
ret = silc_parse_userfqdn(username, u, sizeof(u), h, sizeof(h));
- if (!u)
+ if (!ret)
return NULL;
if (!silc_identifier_verify(u, strlen(u), SILC_STRING_UTF8, 128))
return NULL;
client->mode = 0;
client->router = NULL;
client->connection = NULL;
+ silc_dlist_del(server->expired_clients, client);
silc_dlist_add(server->expired_clients, client);
break;
client->mode = 0;
client->router = NULL;
client->connection = NULL;
+ silc_dlist_del(server->expired_clients, client);
silc_dlist_add(server->expired_clients, client);
break;
}
detached_client->data.status |= SILC_IDLIST_STATUS_RESUMED;
detached_client->data.status &= ~SILC_IDLIST_STATUS_LOCAL;
silc_dlist_del(server->expired_clients, detached_client);
+ silc_dlist_del(server->expired_clients, detached_client);
/* Check if anyone is watching this client */
if (server->server_type == SILC_ROUTER)
silc_dlist_start(server->expired_clients);
while ((client = silc_dlist_get(server->expired_clients))) {
- if (client->data.status & SILC_IDLIST_STATUS_REGISTERED)
- continue;
-
/* For unregistered clients the created timestamp is actually
unregistered timestamp. Make sure client remains in history
at least 500 seconds. */
- if (curtime - client->data.created < 500)
+ if (client->data.created && curtime - client->data.created < 500)
continue;
id_list = (client->data.status & SILC_IDLIST_STATUS_LOCAL ?
client->router = NULL;
client->connection = NULL;
client->data.created = silc_time();
+ silc_dlist_del(server->expired_clients, client);
silc_dlist_add(server->expired_clients, client);
} else {
/* Delete directly since we're shutting down server */
client->mode = 0;
client->router = NULL;
client->connection = NULL;
+ silc_dlist_del(server->expired_clients, client);
silc_dlist_add(server->expired_clients, client);
} else {
silc_idlist_del_data(client);
client->mode = 0;
client->router = NULL;
client->connection = NULL;
+ silc_dlist_del(server->expired_clients, client);
silc_dlist_add(server->expired_clients, client);
} else {
silc_idlist_del_data(client);