if (!client || !conn || !nickname)
return NULL;
- /* Parse nickname if it is formatted */
+ /* Parse nickname in case it is formatted */
if (!silc_client_nickname_parse(client, conn, (char *)nickname, &parsed))
return NULL;
return NULL;
}
+ SILC_LOG_DEBUG(("Found %d clients", silc_dlist_count(clients)));
+
silc_dlist_start(clients);
return clients;
}
SilcBuffer idp;
SilcUInt16 cmd_ident;
- if (!client || !conn | !client_id)
+ if (!client || !conn | !client_id) {
+ SILC_LOG_ERROR(("Missing arguments to "
+ "silc_client_get_clients_by_id_resolve call"));
return 0;
+ }
SILC_LOG_DEBUG(("Resolve client by ID (%s)",
silc_id_render(client_id, SILC_ID_CLIENT)));
void *context)
{
SilcClientGetClientInternal i;
- char userhost[768 + 1];
+ char nick[128 + 1], serv[256 + 1], userhost[768 + 1], *parsed = NULL;
int len;
SILC_LOG_DEBUG(("Resolve client by %s command",
silc_get_command_name(command)));
- if (!client || !conn)
+ if (!client || !conn) {
+ SILC_LOG_ERROR(("Missing arguments to silc_client_get_clients call"));
return 0;
- if (!nickname && !attributes)
+ }
+ if (!nickname && !attributes) {
+ SILC_LOG_ERROR(("Missing arguments to silc_client_get_clients call"));
return 0;
+ }
+
+ /* Parse server name from the nickname if set */
+ if (silc_parse_userfqdn(nickname, nick, sizeof(nick),
+ serv, sizeof(serv) == 2))
+ server = (const char *)serv;
+ nickname = (const char *)nick;
+
+ /* Parse nickname in case it is formatted */
+ if (silc_client_nickname_parse(client, conn, (char *)nickname, &parsed))
+ nickname = (const char *)parsed;
i = silc_calloc(1, sizeof(*i));
- if (!i)
+ if (!i) {
+ silc_free(parsed);
return 0;
+ }
i->clients = silc_dlist_init();
if (!i->clients) {
+ silc_free(parsed);
silc_free(i);
return 0;
}
} else if (nickname) {
silc_strncat(userhost, sizeof(userhost) - 1, nickname, strlen(nickname));
}
+ silc_free(parsed);
/* Send the command */
if (command == SILC_COMMAND_IDENTIFY)
char *cp;
char newnick[128 + 1];
int i, off = 0, len;
- SilcBool freebase;
SilcDList clients;
SilcClientEntry entry, unformatted = NULL;
+ SilcBool formatted = FALSE;
if (!client->internal->params->nickname_format[0])
return client_entry;
TRUE, FALSE);
if (!clients)
return NULL;
- if (silc_dlist_count(clients) == 1 &&
+ if (silc_dlist_count(clients) == 1 && !priority &&
!client->internal->params->nickname_force_format) {
silc_client_list_free(client, conn, clients);
return client_entry;
}
- len = 0;
- freebase = TRUE;
+ /* Is the requested client formatted already */
+ if (!silc_utf8_strcasecmp(client_entry->nickname,
+ client_entry->nickname_normalized))
+ formatted = TRUE;
+
+ if (client->internal->params->nickname_force_format)
+ formatted = FALSE;
+
+ /* Find unformatted client entry */
while ((entry = silc_dlist_get(clients))) {
- if (entry->internal.valid && entry != client_entry)
- len++;
- if (entry->internal.valid && entry != client_entry &&
- silc_utf8_strcasecmp(entry->nickname, client_entry->nickname)) {
- freebase = FALSE;
+ if (!entry->internal.valid)
+ continue;
+ if (entry == client_entry)
+ continue;
+ if (silc_utf8_strcasecmp(entry->nickname, entry->nickname_normalized)) {
unformatted = entry;
break;
}
- }
- if (!len || freebase) {
+ }
+
+ /* If there are no other unformatted clients and the requested client is
+ unformatted, just return it. */
+ if (!unformatted && !formatted) {
silc_client_list_free(client, conn, clients);
return client_entry;
}
- /* If priority formatting, this client always gets unformatted nickname. */
- if (unformatted && priority)
+ /* If priority formatting then the requested client will get the
+ unformatted nickname, and the unformatted client will get a new
+ formatted nickname. */
+ if (priority) {
+ if (formatted) {
+ /* Simply change the client's nickname to unformatted */
+ if (!silc_client_nickname_parse(client, conn, client_entry->nickname,
+ &cp))
+ return NULL;
+
+ silc_snprintf(client_entry->nickname, sizeof(client_entry->nickname),
+ cp);
+ silc_free(cp);
+ }
+
+ if (!unformatted) {
+ /* There was no other unformatted client */
+ silc_client_list_free(client, conn, clients);
+ return client_entry;
+ }
+
+ /* Now format the previously unformatted client */
client_entry = unformatted;
+ formatted = FALSE;
+ }
+
+ /* If already formatted just return it */
+ if (formatted) {
+ silc_client_list_free(client, conn, clients);
+ return client_entry;
+ }
memset(newnick, 0, sizeof(newnick));
cp = client->internal->params->nickname_format;