X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcbuffmt.c;h=cc1a4ce238ab7f604d6750df0934305fabefc11c;hp=08c8e29059574735aae2ef79af1bb965d6197abe;hb=e5d8d3db6caa344b3d419b884556c21b15e7d123;hpb=b9d9b5f2a2043436e3d12dff8eb0cdeaecd87719 diff --git a/lib/silcutil/silcbuffmt.c b/lib/silcutil/silcbuffmt.c index 08c8e290..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); @@ -145,15 +175,13 @@ int silc_buffer_format(SilcBuffer dst, ...) fail: SILC_LOG_DEBUG(("Error occured while formatting data")); -#ifdef SILC_DEBUG - assert(FALSE); -#endif return -1; 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 @@ -164,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); @@ -195,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); @@ -204,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); @@ -213,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); @@ -222,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); @@ -244,7 +299,7 @@ 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); @@ -259,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); @@ -272,7 +327,7 @@ 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); @@ -287,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); @@ -303,9 +358,9 @@ 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); @@ -321,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); @@ -338,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; @@ -348,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)); @@ -370,9 +425,6 @@ int silc_buffer_unformat(SilcBuffer src, ...) fail: SILC_LOG_DEBUG(("Error occured while unformatting buffer")); -#ifdef SILC_DEBUG - assert(FALSE); -#endif return -1; ok: