X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcbuffmt.c;h=cc1a4ce238ab7f604d6750df0934305fabefc11c;hp=7faae5463aad65cd77a13da2b03031cdf2eaec99;hb=e5d8d3db6caa344b3d419b884556c21b15e7d123;hpb=48d89bc2868ec49c2ab9aa74efe9ac703eee8f29 diff --git a/lib/silcutil/silcbuffmt.c b/lib/silcutil/silcbuffmt.c index 7faae546..cc1a4ce2 100644 --- a/lib/silcutil/silcbuffmt.c +++ b/lib/silcutil/silcbuffmt.c @@ -40,10 +40,20 @@ do { \ int silc_buffer_format(SilcBuffer dst, ...) { va_list ap; - SilcBufferParamType fmt; - unsigned char *start_ptr = dst->data; + int ret; va_start(ap, dst); + ret = silc_buffer_format_vp(dst, ap); + va_end(ap); + + return ret; +} + +int silc_buffer_format_vp(SilcBuffer dst, va_list ap) +{ + SilcBufferParamType fmt; + unsigned char *start_ptr = dst->data; + int len; /* Parse the arguments by formatting type. */ while(1) { @@ -69,7 +79,7 @@ int silc_buffer_format(SilcBuffer dst, ...) case SILC_BUFFER_PARAM_SI16_SHORT: { unsigned char xf[2]; - short x = (short)va_arg(ap, int); + int16 x = (int16)va_arg(ap, int); HAS_SPACE(dst, 2); SILC_PUT16_MSB(x, xf); silc_buffer_put(dst, xf, 2); @@ -79,7 +89,7 @@ int silc_buffer_format(SilcBuffer dst, ...) case SILC_BUFFER_PARAM_UI16_SHORT: { unsigned char xf[2]; - unsigned short x = (unsigned short)va_arg(ap, int); + uint16 x = (uint16)va_arg(ap, int); HAS_SPACE(dst, 2); SILC_PUT16_MSB(x, xf); silc_buffer_put(dst, xf, 2); @@ -89,7 +99,7 @@ int silc_buffer_format(SilcBuffer dst, ...) case SILC_BUFFER_PARAM_SI32_INT: { unsigned char xf[4]; - int x = va_arg(ap, int); + int32 x = va_arg(ap, int32); HAS_SPACE(dst, 4); SILC_PUT32_MSB(x, xf); silc_buffer_put(dst, xf, 4); @@ -99,20 +109,40 @@ int silc_buffer_format(SilcBuffer dst, ...) case SILC_BUFFER_PARAM_UI32_INT: { unsigned char xf[4]; - unsigned int x = va_arg(ap, unsigned int); + uint32 x = va_arg(ap, uint32); HAS_SPACE(dst, 4); SILC_PUT32_MSB(x, xf); silc_buffer_put(dst, xf, 4); silc_buffer_pull(dst, 4); break; } + case SILC_BUFFER_PARAM_SI64_INT: + { + unsigned char xf[8]; + int64 x = va_arg(ap, int64); + HAS_SPACE(dst, 8); + SILC_PUT64_MSB(x, xf); + silc_buffer_put(dst, xf, 8); + silc_buffer_pull(dst, 8); + break; + } + case SILC_BUFFER_PARAM_UI64_INT: + { + unsigned char xf[8]; + uint64 x = va_arg(ap, uint64); + HAS_SPACE(dst, 8); + SILC_PUT64_MSB(x, xf); + silc_buffer_put(dst, xf, 8); + silc_buffer_pull(dst, 8); + break; + } case SILC_BUFFER_PARAM_UI16_STRING: case SILC_BUFFER_PARAM_UI32_STRING: case SILC_BUFFER_PARAM_UI16_STRING_ALLOC: case SILC_BUFFER_PARAM_UI32_STRING_ALLOC: { unsigned char *x = va_arg(ap, unsigned char *); - int tmp_len = strlen(x); + uint32 tmp_len = strlen(x); HAS_SPACE(dst, tmp_len); silc_buffer_put(dst, x, tmp_len); silc_buffer_pull(dst, tmp_len); @@ -126,7 +156,7 @@ int silc_buffer_format(SilcBuffer dst, ...) case SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC: { unsigned char *x = va_arg(ap, unsigned char *); - unsigned int len = va_arg(ap, unsigned int); + uint32 len = va_arg(ap, uint32); HAS_SPACE(dst, len); silc_buffer_put(dst, x, len); silc_buffer_pull(dst, len); @@ -149,8 +179,9 @@ int silc_buffer_format(SilcBuffer dst, ...) ok: /* Push the buffer back to where it belongs. */ - silc_buffer_push(dst, dst->data - start_ptr); - return dst->len; + len = dst->data - start_ptr; + silc_buffer_push(dst, len); + return len; } /* Unformats the buffer sent as argument. The unformatted data is returned @@ -161,12 +192,21 @@ int silc_buffer_format(SilcBuffer dst, ...) int silc_buffer_unformat(SilcBuffer src, ...) { va_list ap; + int ret; + + va_start(ap, src); + ret = silc_buffer_unformat_vp(src, ap); + va_end(ap); + + return ret; +} + +int silc_buffer_unformat_vp(SilcBuffer src, va_list ap) +{ SilcBufferParamType fmt; unsigned char *start_ptr = src->data; int len = 0; - va_start(ap, src); - /* Parse the arguments by formatting type. */ while(1) { fmt = va_arg(ap, SilcBufferParamType); @@ -192,7 +232,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_SI16_SHORT: { - short *x = va_arg(ap, short *); + int16 *x = va_arg(ap, int16 *); HAS_SPACE(src, 2); if (x) SILC_GET16_MSB(*x, src->data); @@ -201,7 +241,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI16_SHORT: { - unsigned short *x = va_arg(ap, unsigned short *); + uint16 *x = va_arg(ap, uint16 *); HAS_SPACE(src, 2); if (x) SILC_GET16_MSB(*x, src->data); @@ -210,7 +250,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_SI32_INT: { - int *x = va_arg(ap, int *); + int32 *x = va_arg(ap, int32 *); HAS_SPACE(src, 4); if (x) SILC_GET32_MSB(*x, src->data); @@ -219,16 +259,34 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI32_INT: { - unsigned int *x = va_arg(ap, unsigned int *); + uint32 *x = va_arg(ap, uint32 *); HAS_SPACE(src, 4); if (x) SILC_GET32_MSB(*x, src->data); silc_buffer_pull(src, 4); break; } + case SILC_BUFFER_PARAM_SI64_INT: + { + int64 *x = va_arg(ap, int64 *); + HAS_SPACE(src, 8); + if (x) + SILC_GET64_MSB(*x, src->data); + silc_buffer_pull(src, 8); + break; + } + case SILC_BUFFER_PARAM_UI64_INT: + { + uint64 *x = va_arg(ap, uint64 *); + HAS_SPACE(src, 8); + if (x) + SILC_GET64_MSB(*x, src->data); + silc_buffer_pull(src, 8); + break; + } case SILC_BUFFER_PARAM_UI16_STRING: { - unsigned short len2; + uint16 len2; unsigned char **x = va_arg(ap, unsigned char **); HAS_SPACE(src, 2); SILC_GET16_MSB(len2, src->data); @@ -241,13 +299,13 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI16_STRING_ALLOC: { - unsigned short len2; + uint16 len2; unsigned char **x = va_arg(ap, unsigned char **); HAS_SPACE(src, 2); SILC_GET16_MSB(len2, src->data); silc_buffer_pull(src, 2); HAS_SPACE(src, len2); - if (x) { + if (x && len2) { *x = silc_calloc(len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } @@ -256,7 +314,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI32_STRING: { - unsigned int len2; + uint32 len2; unsigned char **x = va_arg(ap, unsigned char **); HAS_SPACE(src, 4); SILC_GET32_MSB(len2, src->data); @@ -269,13 +327,13 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI32_STRING_ALLOC: { - unsigned int len2; + uint32 len2; unsigned char **x = va_arg(ap, unsigned char **); HAS_SPACE(src, 4); SILC_GET32_MSB(len2, src->data); silc_buffer_pull(src, 4); HAS_SPACE(src, len2); - if (x) { + if (x && len2) { *x = silc_calloc(len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } @@ -284,9 +342,9 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI16_NSTRING: { - unsigned short len2; + uint16 len2; unsigned char **x = va_arg(ap, unsigned char **); - unsigned short *len = va_arg(ap, unsigned short *); + uint16 *len = va_arg(ap, unsigned short *); HAS_SPACE(src, 2); SILC_GET16_MSB(len2, src->data); silc_buffer_pull(src, 2); @@ -300,16 +358,16 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC: { - unsigned short len2; + uint16 len2; unsigned char **x = va_arg(ap, unsigned char **); - unsigned short *len = va_arg(ap, unsigned short *); + uint16 *len = va_arg(ap, uint16 *); HAS_SPACE(src, 2); SILC_GET16_MSB(len2, src->data); silc_buffer_pull(src, 2); HAS_SPACE(src, len2); if (len) *len = len2; - if (x) { + if (x && len2) { *x = silc_calloc(len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } @@ -318,9 +376,9 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI32_NSTRING: { - unsigned int len2; + uint32 len2; unsigned char **x = va_arg(ap, unsigned char **); - unsigned int *len = va_arg(ap, unsigned int *); + uint32 *len = va_arg(ap, uint32 *); HAS_SPACE(src, 4); SILC_GET32_MSB(len2, src->data); silc_buffer_pull(src, 4); @@ -335,7 +393,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) case SILC_BUFFER_PARAM_UI_XNSTRING: { unsigned char **x = va_arg(ap, unsigned char **); - unsigned int len = va_arg(ap, unsigned int); + uint32 len = va_arg(ap, uint32); HAS_SPACE(src, len); if (len && x) *x = src->data; @@ -345,7 +403,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) case SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC: { unsigned char **x = va_arg(ap, unsigned char **); - unsigned int len = va_arg(ap, unsigned int); + uint32 len = va_arg(ap, uint32); HAS_SPACE(src, len); if (len && x) { *x = silc_calloc(len + 1, sizeof(unsigned char));