silc_hash_table_del(channel->user_list, chl2->client);
silc_free(chl2);
}
+ silc_hash_table_list_reset(&htl2);
continue;
}
if (!silc_hash_table_find(channels, channel, NULL, NULL))
silc_hash_table_add(channels, channel, channel);
}
+ silc_hash_table_list_reset(&htl);
silc_buffer_free(clidp);
}
silc_buffer_free(idp);
}
- /* Remove the client entry */
- silc_server_remove_clients_channels(server, NULL, client, channels);
- client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
- id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
+ /* Update statistics */
server->stat.clients--;
if (server->server_type == SILC_ROUTER)
server->stat.cell_clients--;
+ SILC_OPER_STATS_UPDATE(client, server, SILC_UMODE_SERVER_OPERATOR);
+ SILC_OPER_STATS_UPDATE(client, router, SILC_UMODE_ROUTER_OPERATOR);
+
+ /* Remove the client entry */
+ silc_server_remove_clients_channels(server, NULL, client, channels);
+ if (!server_signoff) {
+ client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
+ id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
+ } else {
+ silc_idlist_del_client(server->local_list, client);
+ }
if (!silc_idcache_list_next(list, &id_cache))
break;
silc_buffer_free(idp);
}
- /* Remove the client entry */
- silc_server_remove_clients_channels(server, NULL, client, channels);
- client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
- id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
+ /* Update statistics */
server->stat.clients--;
if (server->server_type == SILC_ROUTER)
server->stat.cell_clients--;
+ SILC_OPER_STATS_UPDATE(client, server, SILC_UMODE_SERVER_OPERATOR);
+ SILC_OPER_STATS_UPDATE(client, router, SILC_UMODE_ROUTER_OPERATOR);
+
+ /* Remove the client entry */
+ silc_server_remove_clients_channels(server, NULL, client, channels);
+ if (!server_signoff) {
+ client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
+ id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
+ } else {
+ silc_idlist_del_client(server->global_list, client);
+ }
if (!silc_idcache_list_next(list, &id_cache))
break;
must re-generate the channel key. */
silc_hash_table_list(channels, &htl);
while (silc_hash_table_get(&htl, NULL, (void *)&channel)) {
- if (!silc_server_create_channel_key(server, channel, 0))
+ if (!silc_server_create_channel_key(server, channel, 0)) {
+ silc_hash_table_list_reset(&htl);
+ silc_hash_table_free(channels);
return FALSE;
+ }
/* Do not send the channel key if private channel key mode is set */
if (channel->mode & SILC_CHANNEL_MODE_PRIVKEY)
server->server_type == SILC_ROUTER ?
FALSE : !server->standalone);
}
+ silc_hash_table_list_reset(&htl);
silc_hash_table_free(channels);
return TRUE;
silc_hash_table_list(channel->user_list, &htl);
while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
- if (chl->client->router)
+ if (chl->client->router) {
+ silc_hash_table_list_reset(&htl);
return TRUE;
+ }
}
+ silc_hash_table_list_reset(&htl);
return FALSE;
}
silc_hash_table_list(channel->user_list, &htl);
while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
- if (!chl->client->router)
+ if (!chl->client->router) {
+ silc_hash_table_list_reset(&htl);
return TRUE;
+ }
}
+ silc_hash_table_list_reset(&htl);
return FALSE;
}
if (!client || !channel)
return FALSE;
- if (silc_hash_table_find(client->channels, channel, NULL, NULL))
- return TRUE;
+ return silc_hash_table_find(client->channels, channel, NULL, NULL);
+}
+
+/* Checks string for bad characters and returns TRUE if they are found. */
+
+bool silc_server_name_bad_chars(const char *name, uint32 name_len)
+{
+ int i;
+
+ for (i = 0; i < name_len; i++) {
+ if (!isascii(name[i]))
+ return TRUE;
+ if (name[i] <= 32) return TRUE;
+ if (name[i] == ' ') return TRUE;
+ if (name[i] == '*') return TRUE;
+ if (name[i] == '?') return TRUE;
+ if (name[i] == ',') return TRUE;
+ }
return FALSE;
}
+
+/* Modifies the `name' if it includes bad characters and returns new
+ allocated name that does not include bad characters. */
+
+char *silc_server_name_modify_bad(const char *name, uint32 name_len)
+{
+ int i;
+ char *newname = strdup(name);
+
+ for (i = 0; i < name_len; i++) {
+ if (!isascii(newname[i])) newname[i] = '_';
+ if (newname[i] <= 32) newname[i] = '_';
+ if (newname[i] == ' ') newname[i] = '_';
+ if (newname[i] == '*') newname[i] = '_';
+ if (newname[i] == '?') newname[i] = '_';
+ if (newname[i] == ',') newname[i] = '_';
+ }
+
+ return newname;
+}