+ argv_types[i] = x_type;
+ }
+
+ buffer = silc_command_encode_payload(cmd, argc, argv,
+ argv_lens, argv_types);
+
+ for (i = 0; i < argc; i++)
+ silc_free(argv[i]);
+ silc_free(argv);
+ silc_free(argv_lens);
+ silc_free(argv_types);
+
+ return buffer;
+}
+
+/* Same as above except that this is used to encode strictly command
+ reply packets. The command status message to be returned is sent as
+ extra argument to this function. The `argc' must not count `status'
+ as on argument. */
+
+SilcBuffer
+silc_command_encode_reply_payload_va(SilcCommand cmd,
+ SilcCommandStatus status,
+ unsigned int argc, ...)
+{
+ va_list ap;
+ unsigned char **argv;
+ unsigned int *argv_lens = NULL, *argv_types = NULL;
+ unsigned char status_data[2];
+ unsigned char *x;
+ unsigned int x_len;
+ unsigned int x_type;
+ SilcBuffer buffer;
+ int i;
+
+ va_start(ap, argc);
+
+ argc++;
+ argv = silc_calloc(argc, sizeof(unsigned char *));
+ argv_lens = silc_calloc(argc, sizeof(unsigned int));
+ argv_types = silc_calloc(argc, sizeof(unsigned int));
+
+ SILC_PUT16_MSB(status, status_data);
+ argv[0] = silc_calloc(sizeof(status_data) + 1, sizeof(unsigned char));
+ memcpy(argv[0], status_data, sizeof(status_data));
+ argv_lens[0] = sizeof(status_data);
+ argv_types[0] = 1;
+
+ for (i = 1; i < argc; i++) {
+ x_type = va_arg(ap, unsigned int);
+ x = va_arg(ap, unsigned char *);
+ x_len = va_arg(ap, unsigned int);
+
+ argv[i] = silc_calloc(x_len + 1, sizeof(unsigned char));
+ memcpy(argv[i], x, x_len);
+ argv_lens[i] = x_len;
+ argv_types[i] = x_type;