- if (args_num && payload_len) {
-
- new->argv = silc_calloc(args_num, sizeof(unsigned char *));
- new->argv_lens = silc_calloc(args_num, sizeof(unsigned int));
- new->argv_types = silc_calloc(args_num, sizeof(unsigned int));
-
- silc_buffer_pull(buffer, SILC_COMMAND_PAYLOAD_LEN);
- pull_len += SILC_COMMAND_PAYLOAD_LEN;
-
- /* Parse Command Argument Payloads */
- arg_num = 1;
- while(arg_num) {
- silc_buffer_unformat(buffer,
- SILC_STR_UI_CHAR(&arg_num),
- SILC_STR_UI_CHAR(&arg_type),
- SILC_STR_UI_SHORT(&payload_len),
- SILC_STR_END);
-
- /* Check that argument number is correct */
- if (arg_num != i + 1)
- goto err;
-
- new->argv_lens[i] = payload_len;
- new->argv_types[i] = arg_type;
-
- /* Get argument data */
- silc_buffer_pull(buffer, 4);
- silc_buffer_unformat(buffer,
- SILC_STR_UI_XNSTRING_ALLOC(&new->argv[i],
- payload_len),
- SILC_STR_END);
- silc_buffer_pull(buffer, payload_len);
- pull_len += 4 + payload_len;
-
- i++;
-
- if (i == args_num)
- break;
+ silc_buffer_pull(&buffer, SILC_COMMAND_PAYLOAD_LEN);
+ if (args_num) {
+ new->args = silc_argument_payload_parse(buffer.data, buffer.len, args_num);
+ if (!new->args) {
+ silc_free(new);
+ return NULL;