- 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) {
+ newp->args = silc_argument_payload_parse(buffer.data, buffer.len,
+ args_num);
+ if (!newp->args) {
+ silc_free(newp);
+ return NULL;