X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/99c91c3aec40b691641374f58e798bd8d6b657bd..8030a66cdcbf81c88cbb7c38ef7a334e9f1941cd:/cpack.c diff --git a/cpack.c b/cpack.c index e37d813d..12470fc2 100644 --- a/cpack.c +++ b/cpack.c @@ -28,16 +28,18 @@ */ #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif #include #include -#include +#include "netdissect-stdinc.h" -#include "cpack.h" +#include "netdissect.h" #include "extract.h" +#include "cpack.h" + const uint8_t * cpack_next_boundary(const uint8_t *buf, const uint8_t *p, size_t alignment) { @@ -100,13 +102,29 @@ cpack_uint64(struct cpack_state *cs, uint64_t *u) if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) return -1; - *u = EXTRACT_LE_64BITS(next); + *u = EXTRACT_LE_U_8(next); /* Move pointer past the uint64_t. */ cs->c_next = next + sizeof(*u); return 0; } +/* Unpack a 64-bit signed integer. */ +int +cpack_int64(struct cpack_state *cs, int64_t *u) +{ + const uint8_t *next; + + if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) + return -1; + + *u = EXTRACT_LE_S_8(next); + + /* Move pointer past the int64_t. */ + cs->c_next = next + sizeof(*u); + return 0; +} + /* Unpack a 32-bit unsigned integer. */ int cpack_uint32(struct cpack_state *cs, uint32_t *u) @@ -116,13 +134,29 @@ cpack_uint32(struct cpack_state *cs, uint32_t *u) if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) return -1; - *u = EXTRACT_LE_32BITS(next); + *u = EXTRACT_LE_U_4(next); /* Move pointer past the uint32_t. */ cs->c_next = next + sizeof(*u); return 0; } +/* Unpack a 32-bit signed integer. */ +int +cpack_int32(struct cpack_state *cs, int32_t *u) +{ + const uint8_t *next; + + if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) + return -1; + + *u = EXTRACT_LE_S_4(next); + + /* Move pointer past the int32_t. */ + cs->c_next = next + sizeof(*u); + return 0; +} + /* Unpack a 16-bit unsigned integer. */ int cpack_uint16(struct cpack_state *cs, uint16_t *u) @@ -132,13 +166,29 @@ cpack_uint16(struct cpack_state *cs, uint16_t *u) if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) return -1; - *u = EXTRACT_LE_16BITS(next); + *u = EXTRACT_LE_U_2(next); /* Move pointer past the uint16_t. */ cs->c_next = next + sizeof(*u); return 0; } +/* Unpack a 16-bit signed integer. */ +int +cpack_int16(struct cpack_state *cs, int16_t *u) +{ + const uint8_t *next; + + if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) + return -1; + + *u = EXTRACT_LE_S_2(next); + + /* Move pointer past the int16_t. */ + cs->c_next = next + sizeof(*u); + return 0; +} + /* Unpack an 8-bit unsigned integer. */ int cpack_uint8(struct cpack_state *cs, uint8_t *u) @@ -147,9 +197,24 @@ cpack_uint8(struct cpack_state *cs, uint8_t *u) if ((size_t)(cs->c_next - cs->c_buf) >= cs->c_len) return -1; - *u = *cs->c_next; + *u = EXTRACT_U_1(cs->c_next); /* Move pointer past the uint8_t. */ cs->c_next++; return 0; } + +/* Unpack an 8-bit signed integer. */ +int +cpack_int8(struct cpack_state *cs, int8_t *u) +{ + /* No space left? */ + if ((size_t)(cs->c_next - cs->c_buf) >= cs->c_len) + return -1; + + *u = EXTRACT_S_1(cs->c_next); + + /* Move pointer past the int8_t. */ + cs->c_next++; + return 0; +}