silc_list_add(cmd->reply_callbacks, cb);
}
+ SILC_LOG_DEBUG(("pending: cmd %p, command %d, ident %d", cmd, cmd->cmd,
+ cmd->cmd_ident));
+
/* Add pending reply */
silc_list_add(conn->internal->pending_commands, cmd);
argv_lens = silc_realloc(argv_lens, sizeof(*argv_lens) * (argc + 1));
argv_types = silc_realloc(argv_types, sizeof(*argv_types) * (argc + 1));
if (!argv || !argv_lens || !argv_types)
- return FALSE;
+ return 0;
argv[argc] = silc_memdup(arg, strlen(arg));
if (!argv[argc])
- return FALSE;
+ return 0;
argv_lens[argc] = strlen(arg);
argv_types[argc] = argc;
argc++;
silc_mutex_unlock(conn->internal->lock);
- return FALSE;
+ return TRUE;
}
/******************************** WHOIS *************************************/
/* Given without arguments fetches client's own information */
if (cmd->argc < 2) {
- silc_client_command_send(conn->client, conn, SILC_COMMAND_WHOIS,
- NULL, NULL, 1,
- 4, silc_buffer_datalen(conn->local_idp));
- goto out;
+ silc_client_command_send_va(conn, cmd, cmd->cmd, NULL, NULL, 1, 4,
+ silc_buffer_data(conn->internal->local_idp),
+ silc_buffer_len(conn->internal->local_idp));
+
+ /* Notify application */
+ COMMAND(SILC_STATUS_OK);
+
+ /** Wait for command reply */
+ silc_fsm_next(fsm, silc_client_command_reply_wait);
+ return SILC_FSM_CONTINUE;
}
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->callback_context);
+
+ /* Signal to close connection */
+ conn->internal->disconnected = TRUE;
+ SILC_FSM_SEMA_POST(&conn->internal->wait_event);
return SILC_FSM_FINISH;
}
auth = silc_auth_public_key_auth_generate(conn->public_key,
conn->private_key,
conn->client->rng,
- client->sha1hash,
+ conn->internal->sha1hash,
&target->id, SILC_ID_CLIENT);
}
}
/* Send the command */
silc_client_command_send_va(conn, cmd, cmd->cmd, NULL, NULL, 1,
- 1, silc_buffer_datalen(conn->remote_idp));
+ 1, silc_buffer_datalen(conn->internal->
+ remote_idp));
/* Notify application */
COMMAND(SILC_STATUS_OK);
/* Send the command */
silc_client_command_send_va(conn, cmd, cmd->cmd, NULL, NULL, 1,
- 1, silc_buffer_datalen(conn->remote_idp));
+ 1, silc_buffer_datalen(conn->internal->
+ remote_idp));
/* Save ping time */
cmd->context = SILC_64_TO_PTR(silc_time());
auth = silc_auth_public_key_auth_generate(conn->public_key,
conn->private_key,
conn->client->rng,
- conn->client->sha1hash,
+ conn->internal->sha1hash,
conn->local_id,
SILC_ID_CLIENT);
} else if (!strcasecmp(cmd->argv[i], "-auth")) {
}
pk = silc_pkcs_public_key_encode(pubkey, &pk_len);
- silc_hash_make(conn->client->sha1hash, pk, pk_len, pkhash);
+ silc_hash_make(conn->internal->sha1hash, pk, pk_len, pkhash);
silc_free(pk);
pubdata = silc_rng_get_rn_data(conn->client->rng, 128);
memcpy(pubdata, pkhash, 20);
cauth = silc_auth_public_key_auth_generate_wpub(pubkey, privkey,
pubdata, 128,
- conn->client->sha1hash,
+ conn->internal->sha1hash,
conn->local_id,
SILC_ID_CLIENT);
memset(pubdata, 0, 128);
/* Send JOIN command to the server */
silc_client_command_send_va(conn, cmd, cmd->cmd, NULL, NULL, 7,
1, name, strlen(name),
- 2, silc_buffer_datalen(conn->local_idp),
+ 2, silc_buffer_datalen(conn->internal->
+ local_idp),
3, passphrase, passphrase_len,
4, cipher, cipher ? strlen(cipher) : 0,
5, hmac, hmac ? strlen(hmac) : 0,
/* Send the command */
silc_client_command_send_va(conn, cmd, cmd->cmd, NULL, NULL, 2,
- 1, silc_buffer_datalen(conn->local_idp),
+ 1, silc_buffer_datalen(conn->internal->
+ local_idp),
2, modebuf, sizeof(modebuf));
/* Notify application */
pk = silc_public_key_payload_encode(pubkey);
auth = silc_auth_public_key_auth_generate(pubkey, privkey,
conn->client->rng,
- conn->client->sha1hash,
+ conn->internal->sha1hash,
conn->local_id,
SILC_ID_CLIENT);
arg = silc_buffer_data(auth);
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
auth = silc_auth_public_key_auth_generate(pubkey, privkey,
conn->client->rng,
- conn->client->sha1hash,
+ conn->internal->sha1hash,
conn->local_id,
SILC_ID_CLIENT);
mode |= SILC_CHANNEL_UMODE_CHANFO;
}
}
- 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,
/* Send the commmand */
silc_client_command_send_va(conn, cmd, cmd->cmd, NULL, NULL, 2,
- 1, silc_buffer_datalen(conn->local_idp),
+ 1, silc_buffer_datalen(conn->internal->
+ local_idp),
type, pubkey ? args->data : cmd->argv[2],
pubkey ? silc_buffer_len(args) :
cmd->argv_lens[2]);
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;
}