/* Parses buffer and return ID payload into payload structure */
-SilcIDPayload silc_id_payload_parse(SilcBuffer buffer)
+SilcIDPayload silc_id_payload_parse(const unsigned char *payload,
+ uint32 payload_len)
{
- SilcIDPayload new;
- int ret;
-
- SILC_LOG_DEBUG(("Parsing ID payload"));
-
- new = silc_calloc(1, sizeof(*new));
-
- ret = silc_buffer_unformat(buffer,
- SILC_STR_UI_SHORT(&new->type),
- SILC_STR_UI_SHORT(&new->len),
- SILC_STR_END);
- if (ret == -1)
- goto err;
-
- silc_buffer_pull(buffer, 4);
-
- if (new->len > buffer->len)
- goto err;
-
- ret = silc_buffer_unformat(buffer,
- SILC_STR_UI_XNSTRING_ALLOC(&new->id, new->len),
- SILC_STR_END);
- if (ret == -1)
- goto err;
-
- silc_buffer_push(buffer, 4);
-
- return new;
-
- err:
- silc_free(new);
- return NULL;
-}
-
-/* Parses data and return ID payload into payload structure. */
-
-SilcIDPayload silc_id_payload_parse_data(unsigned char *data,
- uint32 len)
-{
- SilcIDPayload new;
SilcBufferStruct buffer;
+ SilcIDPayload new;
int ret;
SILC_LOG_DEBUG(("Parsing ID payload"));
- silc_buffer_set(&buffer, data, len);
-
+ silc_buffer_set(&buffer, (unsigned char *)payload, payload_len);
new = silc_calloc(1, sizeof(*new));
ret = silc_buffer_unformat(&buffer,
if (ret == -1)
goto err;
+ silc_buffer_push(&buffer, 4);
+
return new;
err:
/* Return the ID directly from the raw payload data. */
-void *silc_id_payload_parse_id(unsigned char *data, uint32 len)
+void *silc_id_payload_parse_id(const unsigned char *data, uint32 len)
{
SilcBufferStruct buffer;
SilcIdType type;
int ret;
void *id;
- silc_buffer_set(&buffer, data, len);
-
+ silc_buffer_set(&buffer, (unsigned char *)data, len);
ret = silc_buffer_unformat(&buffer,
SILC_STR_UI_SHORT(&type),
SILC_STR_UI_SHORT(&idlen),
/* Encodes ID Payload */
-SilcBuffer silc_id_payload_encode(void *id, SilcIdType type)
+SilcBuffer silc_id_payload_encode(const void *id, SilcIdType type)
{
SilcBuffer buffer;
unsigned char *id_data;
/* Parses arguments and returns them into Argument Payload structure. */
-SilcArgumentPayload silc_argument_payload_parse(SilcBuffer buffer,
+SilcArgumentPayload silc_argument_payload_parse(const unsigned char *payload,
+ uint32 payload_len,
uint32 argc)
{
+ SilcBufferStruct buffer;
SilcArgumentPayload new;
- uint16 payload_len = 0;
+ uint16 p_len = 0;
unsigned char arg_num = 0;
unsigned char arg_type = 0;
uint32 pull_len = 0;
SILC_LOG_DEBUG(("Parsing argument payload"));
+ silc_buffer_set(&buffer, (unsigned char *)payload, payload_len);
new = silc_calloc(1, sizeof(*new));
new->argv = silc_calloc(argc, sizeof(unsigned char *));
new->argv_lens = silc_calloc(argc, sizeof(uint32));
/* Get arguments */
arg_num = 1;
for (i = 0; i < argc; i++) {
- 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(&arg_type),
SILC_STR_END);
if (ret == -1)
goto err;
- new->argv_lens[i] = payload_len;
+ new->argv_lens[i] = p_len;
new->argv_types[i] = arg_type;
- if (payload_len > buffer->len - 3)
+ if (p_len > buffer.len - 3)
break;
/* Get argument data */
- silc_buffer_pull(buffer, 3);
- ret = silc_buffer_unformat(buffer,
+ silc_buffer_pull(&buffer, 3);
+ ret = silc_buffer_unformat(&buffer,
SILC_STR_UI_XNSTRING_ALLOC(&new->argv[i],
- payload_len),
+ p_len),
SILC_STR_END);
if (ret == -1)
goto err;
- silc_buffer_pull(buffer, payload_len);
- pull_len += 3 + payload_len;
+ silc_buffer_pull(&buffer, p_len);
+ pull_len += 3 + p_len;
}
- if (buffer->len != 0)
+ if (buffer.len != 0)
goto err;
new->argc = argc;
new->pos = 0;
- silc_buffer_push(buffer, pull_len);
+ silc_buffer_push(&buffer, pull_len);
return new;