No longer rely on libsocket for endian conversions

This commit is contained in:
Pierre Pronchery 2018-01-17 02:33:39 +01:00
parent d13abb1d43
commit 9f626360b1

View File

@ -19,7 +19,6 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <arpa/inet.h>
#include "System/error.h" #include "System/error.h"
#include "System/object.h" #include "System/object.h"
#include "System/variable.h" #include "System/variable.h"
@ -60,6 +59,9 @@ static const size_t _variable_sizes[VT_COUNT] = { 0, 1,
/* prototypes */ /* prototypes */
static uint16_t _bswap16(uint16_t u);
static uint32_t _bswap32(uint32_t u);
static void _variable_destroy(Variable * variable); static void _variable_destroy(Variable * variable);
@ -224,7 +226,7 @@ Variable * variable_new_deserialize_type(VariableType type, size_t * size,
if(*size < s) if(*size < s)
break; break;
memcpy(&u32, data, s); memcpy(&u32, data, s);
u32 = ntohl(u32); u32 = _bswap32(u32);
s += u32; s += u32;
break; break;
case VT_FLOAT: case VT_FLOAT:
@ -274,11 +276,11 @@ Variable * variable_new_deserialize_type(VariableType type, size_t * size,
break; break;
case VT_INT16: case VT_INT16:
case VT_UINT16: case VT_UINT16:
i16 = ntohs(i16); i16 = _bswap16(i16);
break; break;
case VT_INT32: case VT_INT32:
case VT_UINT32: case VT_UINT32:
i32 = ntohl(i32); i32 = _bswap32(i32);
break; break;
case VT_FLOAT: case VT_FLOAT:
i32 = sscanf(p, "%e", &f); i32 = sscanf(p, "%e", &f);
@ -752,22 +754,22 @@ int variable_serialize(Variable * variable, Buffer * buffer, bool prefix)
break; break;
case VT_INT16: case VT_INT16:
size = sizeof(i16); size = sizeof(i16);
i16 = htons(variable->u.int16); i16 = _bswap16(variable->u.int16);
p = &i16; p = &i16;
break; break;
case VT_UINT16: case VT_UINT16:
size = sizeof(u16); size = sizeof(u16);
u16 = htons(variable->u.uint16); u16 = _bswap16(variable->u.uint16);
p = &u16; p = &u16;
break; break;
case VT_INT32: case VT_INT32:
size = sizeof(i32); size = sizeof(i32);
i32 = htonl(variable->u.int32); i32 = _bswap32(variable->u.int32);
p = &i32; p = &i32;
break; break;
case VT_UINT32: case VT_UINT32:
size = sizeof(u32); size = sizeof(u32);
u32 = htonl(variable->u.uint32); u32 = _bswap32(variable->u.uint32);
p = &u32; p = &u32;
break; break;
case VT_INT64: case VT_INT64:
@ -787,7 +789,7 @@ int variable_serialize(Variable * variable, Buffer * buffer, bool prefix)
case VT_BUFFER: case VT_BUFFER:
size = buffer_get_size(variable->u.buffer); size = buffer_get_size(variable->u.buffer);
u32 = buffer_get_size(variable->u.buffer); u32 = buffer_get_size(variable->u.buffer);
u32 = htonl(u32); u32 = _bswap32(u32);
p = buffer_get_data(variable->u.buffer); p = buffer_get_data(variable->u.buffer);
break; break;
case VT_STRING: case VT_STRING:
@ -828,6 +830,21 @@ int variable_serialize(Variable * variable, Buffer * buffer, bool prefix)
/* private */ /* private */
/* bswap16 */
static uint16_t _bswap16(uint16_t u)
{
return ((u & 0xff) << 8) | ((u & 0xff00) >> 8);
}
/* bswap32 */
static uint32_t _bswap32(uint32_t u)
{
return ((u & 0xff) << 24) | ((u & 0xff00) << 8)
| ((u & 0xff0000) >> 8) | ((u & 0xff000000) >> 24);
}
/* variable_destroy */ /* variable_destroy */
static void _variable_destroy(Variable * variable) static void _variable_destroy(Variable * variable)
{ {