/* Get Client ID */
SILC_GET16_MSB(idp_len, client_id_list->data + 2);
idp_len += 4;
- client_id = silc_id_payload_parse_id(client_id_list->data, idp_len);
+ client_id = silc_id_payload_parse_id(client_id_list->data, idp_len, NULL);
if (!client_id) {
silc_buffer_pull(client_id_list, idp_len);
continue;
/* Get Client ID */
SILC_GET16_MSB(idp_len, client_id_list->data + 2);
idp_len += 4;
- client_id = silc_id_payload_parse_id(client_id_list->data, idp_len);
+ client_id = silc_id_payload_parse_id(client_id_list->data, idp_len, NULL);
if (!client_id) {
silc_buffer_pull(client_id_list, idp_len);
continue;
/* Get the client */
entry = silc_client_get_client_by_id(i->client, i->conn, i->client_id);
- if (entry)
- i->completion(i->client, i->conn, &entry, 1, i->context);
- else
- i->completion(i->client, i->conn, NULL, 0, i->context);
+ if (entry) {
+ if (i->completion)
+ i->completion(i->client, i->conn, &entry, 1, i->context);
+ } else {
+ if (i->completion)
+ i->completion(i->client, i->conn, NULL, 0, i->context);
+ }
silc_free(i->client_id);
silc_free(i);
return entry;
}
+/* Add new server entry */
+
+SilcServerEntry silc_client_add_server(SilcClient client,
+ SilcClientConnection conn,
+ const char *server_name,
+ const char *server_info,
+ SilcServerID *server_id)
+{
+ SilcServerEntry server_entry;
+
+ server_entry = silc_calloc(1, sizeof(*server_entry));
+ if (!server_entry || !server_id)
+ return NULL;
+
+ server_entry->server_id = server_id;
+ if (server_name)
+ server_entry->server_name = strdup(server_name);
+ if (server_info)
+ server_entry->server_info = strdup(server_info);
+
+ /* Add server to cache */
+ if (!silc_idcache_add(conn->server_cache, server_entry->server_name,
+ server_entry->server_id, server_entry, 0, NULL)) {
+ silc_free(server_entry->server_id);
+ silc_free(server_entry->server_name);
+ silc_free(server_entry->server_info);
+ silc_free(server_entry);
+ return NULL;
+ }
+
+ return server_entry;
+}
+
/* Removes server from the cache by the server entry. */
bool silc_client_del_server(SilcClient client, SilcClientConnection conn,
char *cp;
char *newnick = NULL;
int i, off = 0, len;
+ bool freebase;
SilcClientEntry *clients;
SilcUInt32 clients_count = 0;
SilcClientEntry unformatted = NULL;
return;
len = 0;
- for (i = 0; i < clients_count; i++)
+ freebase = TRUE;
+ for (i = 0; i < clients_count; i++) {
if (clients[i]->valid && clients[i] != client_entry)
len++;
- if (!len)
+ if (clients[i]->valid && clients[i] != client_entry &&
+ !strcmp(clients[i]->nickname, client_entry->nickname))
+ freebase = FALSE;
+ }
+ if (!len || freebase)
return;
cp = client->internal->params->nickname_format;