X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccore%2Fsilccommand.c;h=50d96200eddc547736e9604514524af7479de95a;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=e76ad180f69ee55fa415ef82d8f67edd9de47cd8;hpb=e5d8d3db6caa344b3d419b884556c21b15e7d123;p=silc.git diff --git a/lib/silccore/silccommand.c b/lib/silccore/silccommand.c index e76ad180..50d96200 100644 --- a/lib/silccore/silccommand.c +++ b/lib/silccore/silccommand.c @@ -32,7 +32,7 @@ from SILC packets. */ struct SilcCommandPayloadStruct { SilcCommand cmd; - uint16 ident; + SilcUInt16 ident; SilcArgumentPayload args; }; @@ -41,20 +41,23 @@ struct SilcCommandPayloadStruct { /* Parses command payload returning new command payload structure */ -SilcCommandPayload silc_command_payload_parse(SilcBuffer buffer) +SilcCommandPayload silc_command_payload_parse(const unsigned char *payload, + SilcUInt32 payload_len) { + SilcBufferStruct buffer; SilcCommandPayload new; unsigned char args_num; - uint16 payload_len; + SilcUInt16 p_len; int ret; SILC_LOG_DEBUG(("Parsing command payload")); + silc_buffer_set(&buffer, (unsigned char *)payload, payload_len); new = silc_calloc(1, sizeof(*new)); /* Parse the Command Payload */ - ret = silc_buffer_unformat(buffer, - SILC_STR_UI_SHORT(&payload_len), + ret = silc_buffer_unformat(&buffer, + SILC_STR_UI_SHORT(&p_len), SILC_STR_UI_CHAR(&new->cmd), SILC_STR_UI_CHAR(&args_num), SILC_STR_UI_SHORT(&new->ident), @@ -64,7 +67,7 @@ SilcCommandPayload silc_command_payload_parse(SilcBuffer buffer) return NULL; } - if (payload_len != buffer->len) { + if (p_len != buffer.len) { SILC_LOG_ERROR(("Incorrect command payload in packet, packet dropped")); silc_free(new); return NULL; @@ -75,15 +78,15 @@ SilcCommandPayload silc_command_payload_parse(SilcBuffer buffer) return NULL; } - silc_buffer_pull(buffer, SILC_COMMAND_PAYLOAD_LEN); + silc_buffer_pull(&buffer, SILC_COMMAND_PAYLOAD_LEN); if (args_num) { - new->args = silc_argument_payload_parse(buffer, args_num); + new->args = silc_argument_payload_parse(buffer.data, buffer.len, args_num); if (!new->args) { silc_free(new); return NULL; } } - silc_buffer_push(buffer, SILC_COMMAND_PAYLOAD_LEN); + silc_buffer_push(&buffer, SILC_COMMAND_PAYLOAD_LEN); return new; } @@ -91,15 +94,15 @@ SilcCommandPayload silc_command_payload_parse(SilcBuffer buffer) /* Encodes Command Payload returning it to SilcBuffer. */ SilcBuffer silc_command_payload_encode(SilcCommand cmd, - uint32 argc, + SilcUInt32 argc, unsigned char **argv, - uint32 *argv_lens, - uint32 *argv_types, - uint16 ident) + SilcUInt32 *argv_lens, + SilcUInt32 *argv_types, + SilcUInt16 ident) { SilcBuffer buffer; SilcBuffer args = NULL; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Encoding command payload")); @@ -127,7 +130,7 @@ SilcBuffer silc_command_payload_encode(SilcCommand cmd, SILC_STR_UI_XNSTRING(args->data, args->len), SILC_STR_END); silc_buffer_push(buffer, SILC_COMMAND_PAYLOAD_LEN); - silc_free(args); + silc_buffer_free(args); } return buffer; @@ -140,8 +143,8 @@ SilcBuffer silc_command_payload_encode_payload(SilcCommandPayload payload) { SilcBuffer buffer; SilcBuffer args = NULL; - uint32 len = 0; - uint32 argc = 0; + SilcUInt32 len = 0; + SilcUInt32 argc = 0; SILC_LOG_DEBUG(("Encoding command payload")); @@ -170,23 +173,23 @@ SilcBuffer silc_command_payload_encode_payload(SilcCommandPayload payload) SILC_STR_UI_XNSTRING(args->data, args->len), SILC_STR_END); silc_buffer_push(buffer, SILC_COMMAND_PAYLOAD_LEN); - silc_free(args); + silc_buffer_free(args); } return buffer; } /* Encodes Command payload with variable argument list. The arguments - must be: uint32, unsigned char *, unsigned int, ... One - {uint32, unsigned char * and unsigned int} forms one argument, - thus `argc' in case when sending one {uint32, unsigned char * - and uint32} equals one (1) and when sending two of those it + must be: SilcUInt32, unsigned char *, unsigned int, ... One + {SilcUInt32, unsigned char * and unsigned int} forms one argument, + thus `argc' in case when sending one {SilcUInt32, unsigned char * + and SilcUInt32} equals one (1) and when sending two of those it equals two (2), and so on. This has to be preserved or bad things will happen. The variable arguments is: {type, data, data_len}. */ SilcBuffer silc_command_payload_encode_va(SilcCommand cmd, - uint16 ident, - uint32 argc, ...) + SilcUInt16 ident, + SilcUInt32 argc, ...) { va_list ap; SilcBuffer buffer; @@ -201,34 +204,35 @@ SilcBuffer silc_command_payload_encode_va(SilcCommand cmd, /* Same as above but with va_list. */ SilcBuffer silc_command_payload_encode_vap(SilcCommand cmd, - uint16 ident, - uint32 argc, va_list ap) + SilcUInt16 ident, + SilcUInt32 argc, va_list ap) { - unsigned char **argv; - uint32 *argv_lens = NULL, *argv_types = NULL; + unsigned char **argv = NULL; + SilcUInt32 *argv_lens = NULL, *argv_types = NULL; unsigned char *x; - uint32 x_len; - uint32 x_type; + SilcUInt32 x_len; + SilcUInt32 x_type; SilcBuffer buffer; - int i, k; - - argv = silc_calloc(argc, sizeof(unsigned char *)); - argv_lens = silc_calloc(argc, sizeof(uint32)); - argv_types = silc_calloc(argc, sizeof(uint32)); - - for (i = 0, k = 0; i < argc; i++) { - x_type = va_arg(ap, uint32); - x = va_arg(ap, unsigned char *); - x_len = va_arg(ap, uint32); - - if (!x_type || !x || !x_len) - continue; + int i, k = 0; - argv[k] = silc_calloc(x_len + 1, sizeof(unsigned char)); - memcpy(argv[k], x, x_len); - argv_lens[k] = x_len; - argv_types[k] = x_type; - k++; + if (argc) { + argv = silc_calloc(argc, sizeof(unsigned char *)); + argv_lens = silc_calloc(argc, sizeof(SilcUInt32)); + argv_types = silc_calloc(argc, sizeof(SilcUInt32)); + + 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); + argv_lens[k] = x_len; + argv_types[k] = x_type; + k++; + } } buffer = silc_command_payload_encode(cmd, k, argv, argv_lens, @@ -251,42 +255,53 @@ SilcBuffer silc_command_payload_encode_vap(SilcCommand cmd, SilcBuffer silc_command_reply_payload_encode_va(SilcCommand cmd, SilcCommandStatus status, - uint16 ident, - uint32 argc, ...) + SilcUInt16 ident, + SilcUInt32 argc, ...) { va_list ap; + SilcBuffer buffer; + + va_start(ap, argc); + buffer = silc_command_reply_payload_encode_vap(cmd, status, ident, argc, ap); + va_end(ap); + + return buffer; +} + +SilcBuffer +silc_command_reply_payload_encode_vap(SilcCommand cmd, + SilcCommandStatus status, + SilcUInt16 ident, SilcUInt32 argc, + va_list ap) +{ unsigned char **argv; - uint32 *argv_lens = NULL, *argv_types = NULL; + SilcUInt32 *argv_lens = NULL, *argv_types = NULL; unsigned char status_data[2]; unsigned char *x; - uint32 x_len; - uint32 x_type; + SilcUInt32 x_len; + SilcUInt32 x_type; SilcBuffer buffer; int i, k; - va_start(ap, argc); - argc++; argv = silc_calloc(argc, sizeof(unsigned char *)); - argv_lens = silc_calloc(argc, sizeof(uint32)); - argv_types = silc_calloc(argc, sizeof(uint32)); + argv_lens = silc_calloc(argc, sizeof(SilcUInt32)); + argv_types = silc_calloc(argc, sizeof(SilcUInt32)); 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[0] = silc_memdup(status_data, sizeof(status_data)); argv_lens[0] = sizeof(status_data); argv_types[0] = 1; for (i = 1, k = 1; i < argc; i++) { - x_type = va_arg(ap, uint32); + x_type = va_arg(ap, SilcUInt32); x = va_arg(ap, unsigned char *); - x_len = va_arg(ap, uint32); + x_len = va_arg(ap, SilcUInt32); if (!x_type || !x || !x_len) continue; - argv[k] = silc_calloc(x_len + 1, sizeof(unsigned char)); - memcpy(argv[k], x, x_len); + argv[k] = silc_memdup(x, x_len); argv_lens[k] = x_len; argv_types[k] = x_type; k++; @@ -301,8 +316,6 @@ silc_command_reply_payload_encode_va(SilcCommand cmd, silc_free(argv_lens); silc_free(argv_types); - va_end(ap); - return buffer; } @@ -332,7 +345,7 @@ SilcArgumentPayload silc_command_get_args(SilcCommandPayload payload) /* Returns identifier */ -uint16 silc_command_get_ident(SilcCommandPayload payload) +SilcUInt16 silc_command_get_ident(SilcCommandPayload payload) { return payload->ident; } @@ -341,7 +354,7 @@ uint16 silc_command_get_ident(SilcCommandPayload payload) payloads are frequentlly resent in SILC and thusly this makes it easy to set the identifier. */ -void silc_command_set_ident(SilcCommandPayload payload, uint16 ident) +void silc_command_set_ident(SilcCommandPayload payload, SilcUInt16 ident) { payload->ident = ident; }