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)
}
/* 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,
/* 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;
}
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
}
}
- 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);
target = silc_dlist_get(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,
}
}
- 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);
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;
}