summaryrefslogtreecommitdiff
path: root/cpack.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2017-11-23 11:19:38 -0800
committerGuy Harris <guy@alum.mit.edu>2017-11-23 11:19:38 -0800
commitc45bfbe0abffa23618e622cc984f97244b5608dd (patch)
tree49786306f2b9f1cee2616242f1c441981a48ace4 /cpack.c
parentd42f1df527f024122815ddfab1d7cebee042e87c (diff)
downloadtcpdump-c45bfbe0abffa23618e622cc984f97244b5608dd.tar.gz
Clean up signed vs. unsigned.
Have separate cpack_ routines for signed and unsigned numbers, with the signed ones using _S_ extract macros. That way, we can do more type checking. Add EXTRACT_LE_S_ macros. Use signed variables for IEEE80211_RADIOTAP_TX_ATTENUATION and IEEE80211_RADIOTAP_DB_TX_ATTENUATION, rather than using unsigned variables that we cast to int. Also, use EXTRACT_U_1() in cpack_uint8.
Diffstat (limited to 'cpack.c')
-rw-r--r--cpack.c65
1 files changed, 64 insertions, 1 deletions
diff --git a/cpack.c b/cpack.c
index bae7e632..7628a5c3 100644
--- a/cpack.c
+++ b/cpack.c
@@ -107,6 +107,22 @@ cpack_uint64(struct cpack_state *cs, uint64_t *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)
@@ -123,6 +139,22 @@ cpack_uint32(struct cpack_state *cs, uint32_t *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)
@@ -139,6 +171,22 @@ cpack_uint16(struct cpack_state *cs, uint16_t *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 +195,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;
+}