silc_mutex_unlock(conn->internal->lock);
- return FALSE;
+ return TRUE;
}
/******************************** WHOIS *************************************/
for (i = 1; i < cmd->argc; i++) {
if (!strcasecmp(cmd->argv[i], "-details")) {
- details = TRUE;
+ details = TRUE;
} else if (!strcasecmp(cmd->argv[i], "-pubkey") && cmd->argc > i + 1) {
- pubkey = cmd->argv[i + 1];
- i++;
+ pubkey = cmd->argv[i + 1];
+ i++;
} else {
/* We assume that the first parameter is the nickname, if it isn't
-details or -pubkey. The last parameter should always be the count */
/* Get the Channel ID of the channel */
channel = silc_client_get_channel(conn->client, cmd->conn, cmd->argv[1]);
if (channel)
- idp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
+ idp = silc_id_payload_encode(&channel->id, SILC_ID_CHANNEL);
}
if (!idp)
goto out;
}
- idp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
+ idp = silc_id_payload_encode(&channel->id, SILC_ID_CHANNEL);
/* Send TOPIC command to the server */
if (cmd->argc > 2)
SilcChannelEntry channel;
SilcBuffer clidp, chidp, args = NULL;
SilcPublicKey pubkey = NULL;
- SilcDList clients;
+ SilcDList clients = NULL;
char *nickname = NULL, *name;
char *invite = NULL;
unsigned char action[1];
cmd));
client_entry = silc_dlist_get(clients);
- silc_dlist_uninit(clients);
} else {
if (cmd->argv[2][0] == '+')
action[0] = 0x00;
}
/* Send the command */
- chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
+ chidp = silc_id_payload_encode(&channel->id, SILC_ID_CHANNEL);
if (client_entry) {
clidp = silc_id_payload_encode(&client_entry->id, SILC_ID_CLIENT);
silc_client_command_send_va(conn, cmd, cmd->cmd, NULL, NULL, 4,
silc_buffer_free(chidp);
silc_buffer_free(args);
silc_free(nickname);
+ silc_client_list_free(client, conn, clients);
/* Notify application */
COMMAND(SILC_STATUS_OK);
/* Notify application */
COMMAND(SILC_STATUS_OK);
- /* Close connection */
+ /* Call connection callback */
conn->callback(client, conn, SILC_CLIENT_CONN_DISCONNECTED,
- conn->context);
- // silc_client_close_connection(q->client, q->conn->sock->user_data);
+ 0, NULL, conn->context);
+
+ /* Signal to close connection */
+ conn->internal->disconnected = TRUE;
+ SILC_FSM_SEMA_POST(&conn->internal->wait_event);
return SILC_FSM_FINISH;
}
cmd));
target = silc_dlist_get(clients);
- silc_dlist_uninit(clients);
if (cmd->argc >= 3) {
if (strcasecmp(cmd->argv[2], "-pubkey"))
silc_buffer_free(idp);
silc_buffer_free(auth);
silc_free(nickname);
+ silc_client_list_free(client, conn, clients);
/* Notify application */
COMMAND(SILC_STATUS_OK);
if (cmd->argc == 3) {
/* Send empty command to receive the public key list. */
- chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
+ chidp = silc_id_payload_encode(&channel->id, SILC_ID_CHANNEL);
silc_client_command_send_va(conn, cmd, SILC_COMMAND_CMODE,
NULL, NULL, 1,
1, silc_buffer_datalen(chidp));
}
}
- chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
+ chidp = silc_id_payload_encode(&channel->id, SILC_ID_CHANNEL);
SILC_PUT32_MSB(mode, modebuf);
/* Send the command. We support sending only one mode at once that
SilcChannelUser chu;
SilcClientEntry client_entry;
SilcBuffer clidp, chidp, auth = NULL;
- SilcDList clients;
+ SilcDList clients = NULL;
unsigned char *name, *cp, modebuf[4];
SilcUInt32 mode = 0, add, len;
char *nickname = NULL;
cmd));
client_entry = silc_dlist_get(clients);
- silc_dlist_uninit(clients);
/* Get the current mode */
chu = silc_client_on_channel(channel, client_entry);
}
}
- chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
+ chidp = silc_id_payload_encode(&channel->id, SILC_ID_CHANNEL);
SILC_PUT32_MSB(mode, modebuf);
clidp = silc_id_payload_encode(&client_entry->id, SILC_ID_CLIENT);
silc_buffer_free(clidp);
if (auth)
silc_buffer_free(auth);
+ silc_free(nickname);
+ silc_client_list_free(client, conn, clients);
/* Notify application */
COMMAND(SILC_STATUS_OK);
+ /** Wait for command reply */
+ silc_fsm_next(fsm, silc_client_command_reply_wait);
+ return SILC_FSM_CONTINUE;
+
out:
+ silc_client_list_free(client, conn, clients);
silc_free(nickname);
return SILC_FSM_FINISH;
}
SilcChannelEntry channel;
SilcBuffer idp, idp2;
SilcClientEntry target;
- SilcDList clients;
+ SilcDList clients = NULL;
char *name;
char *nickname = NULL;
goto out;
}
target = silc_dlist_get(clients);
- silc_dlist_uninit(clients);
/* Send KICK command to the server */
- idp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
+ idp = silc_id_payload_encode(&channel->id, SILC_ID_CHANNEL);
idp2 = silc_id_payload_encode(&target->id, SILC_ID_CLIENT);
if (cmd->argc == 3)
silc_client_command_send_va(conn, cmd, cmd->cmd, NULL, NULL, 2,
silc_buffer_free(idp);
silc_buffer_free(idp2);
silc_free(nickname);
+ silc_client_list_free(client, conn, clients);
/* Notify application */
COMMAND(SILC_STATUS_OK);
}
}
- chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
+ chidp = silc_id_payload_encode(&channel->id, SILC_ID_CHANNEL);
/* Send the command */
silc_client_command_send_va(conn, cmd, cmd->cmd, NULL, NULL, 3,
goto out;
}
- idp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
+ idp = silc_id_payload_encode(&channel->id, SILC_ID_CHANNEL);
/* Send LEAVE command to the server */
silc_client_command_send_va(conn, cmd, cmd->cmd, NULL, NULL, 1,
client->internal->params->nickname_parse(cmd->argv[1], &nickname);
else
nickname = strdup(cmd->argv[1]);
- if (!nickname)
+ if (!nickname) {
+ COMMAND_ERROR(SILC_STATUS_ERR_RESOURCE_LIMIT);
return SILC_FSM_FINISH;
+ }
/* Find client entry */
clients = silc_client_get_clients_local(client, conn, nickname,
2, cmd->argv[1],
strlen(cmd->argv[1])));
}
- idp = silc_id_payload_encode(server_entry->server_id, SILC_ID_SERVER);
+ idp = silc_id_payload_encode(&server_entry->id, SILC_ID_SERVER);
} else {
client_entry = silc_dlist_get(clients);
idp = silc_id_payload_encode(&client_entry->id, SILC_ID_CLIENT);
- silc_dlist_uninit(clients);
+ silc_client_list_free(client, conn, clients);
}
/* Send the commmand */
payload = silc_command_payload_parse(packet->buffer.data,
silc_buffer_len(&packet->buffer));
if (!payload) {
- /** Bad command payload */
SILC_LOG_DEBUG(("Bad command packet"));
- silc_fsm_next(fsm, silc_client_connection_st_packet);
- return SILC_FSM_CONTINUE;
+ return SILC_FSM_FINISH;
}
/* Get arguments */
}
silc_command_payload_free(payload);
-
- /** Packet processed */
- silc_fsm_next(fsm, silc_client_connection_st_packet);
- return SILC_FSM_CONTINUE;
+ return SILC_FSM_FINISH;
}