+ SilcUInt32 x_len;
+ SilcUInt32 x_type;
+ SilcBuffer buffer = NULL;
+ int i, k = 0;
+
+ if (argc) {
+ argv = silc_calloc(argc, sizeof(unsigned char *));
+ if (!argv)
+ return NULL;
+ argv_lens = silc_calloc(argc, sizeof(SilcUInt32));
+ if (!argv_lens)
+ return NULL;
+ argv_types = silc_calloc(argc, sizeof(SilcUInt32));
+ if (!argv_types)
+ return NULL;
+
+ for (i = 0, k = 0; i < argc; i++) {
+ x_type = va_arg(ap, SilcUInt32);
+ x = va_arg(ap, unsigned char *);
+ x_len = va_arg(ap, SilcUInt32);
+
+ if (!x_type || !x || !x_len)
+ continue;
+
+ argv[k] = silc_memdup(x, x_len);
+ if (!argv[k])
+ goto out;
+ argv_lens[k] = x_len;
+ argv_types[k] = x_type;
+ k++;
+ }
+ }
+
+ buffer = silc_command_payload_encode(cmd, k, argv, argv_lens,
+ argv_types, ident);
+
+ out:
+ for (i = 0; i < k; 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_reply_payload_encode_va(SilcCommand cmd,
+ SilcStatus status,
+ SilcStatus error,
+ SilcUInt16 ident,
+ SilcUInt32 argc, ...)
+{
+ va_list ap;