#ifndef __NEAR_TYPES_H
#define __NEAR_TYPES_H
+#include <byteswap.h>
+
#ifndef FALSE
#define FALSE (0)
#endif
typedef int near_bool_t;
+#define near_get_unaligned(ptr) \
+({ \
+ struct __attribute__((packed)) { \
+ typeof(*(ptr)) __v; \
+ } *__p = (typeof(__p)) (ptr); \
+ __p->__v; \
+})
+
+#define near_put_unaligned(val, ptr) \
+do { \
+ struct __attribute__((packed)) { \
+ typeof(*(ptr)) __v; \
+ } *__p = (typeof(__p)) (ptr); \
+ __p->__v = (val); \
+} while (0)
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+static inline uint64_t near_get_le64(const void *ptr)
+{
+ return near_get_unaligned((const uint64_t *) ptr);
+}
+
+static inline uint64_t near_get_be64(const void *ptr)
+{
+ return bswap_64(near_get_unaligned((const uint64_t *) ptr));
+}
+
+static inline uint32_t near_get_le32(const void *ptr)
+{
+ return near_get_unaligned((const uint32_t *) ptr);
+}
+
+static inline uint32_t near_get_be32(const void *ptr)
+{
+ return bswap_32(near_get_unaligned((const uint32_t *) ptr));
+}
+
+static inline uint16_t near_get_le16(const void *ptr)
+{
+ return near_get_unaligned((const uint16_t *) ptr);
+}
+
+static inline uint16_t near_get_be16(const void *ptr)
+{
+ return bswap_16(near_get_unaligned((const uint16_t *) ptr));
+}
+
+static inline void near_put_le64(uint64_t val, const void *ptr)
+{
+ near_put_unaligned(val, (uint64_t *) ptr);
+}
+
+static inline void near_put_be64(uint64_t val, const void *ptr)
+{
+ near_put_unaligned(bswap_64(val), (uint64_t *) ptr);
+}
+
+static inline void near_put_le32(uint32_t val, const void *ptr)
+{
+ near_put_unaligned(val, (uint32_t *) ptr);
+}
+
+static inline void near_put_be32(uint32_t val, const void *ptr)
+{
+ near_put_unaligned(bswap_32(val), (uint32_t *) ptr);
+}
+
+static inline void near_put_le16(uint16_t val, const void *ptr)
+{
+ near_put_unaligned(val, (uint16_t *) ptr);
+}
+
+static inline void near_put_be16(uint16_t val, const void *ptr)
+{
+ near_put_unaligned(bswap_16(val), (uint16_t *) ptr);
+}
+
+#elif __BYTE_ORDER == __BIG_ENDIAN
+static inline uint64_t near_get_le64(const void *ptr)
+{
+ return bswap_64(near_get_unaligned((const uint64_t *) ptr));
+}
+
+static inline uint64_t near_get_be64(const void *ptr)
+{
+ return near_get_unaligned((const uint64_t *) ptr);
+}
+
+static inline uint32_t near_get_le32(const void *ptr)
+{
+ return bswap_32(near_get_unaligned((const uint32_t *) ptr));
+}
+
+static inline uint32_t near_get_be32(const void *ptr)
+{
+ return near_get_unaligned((const uint32_t *) ptr);
+}
+
+static inline uint16_t near_get_le16(const void *ptr)
+{
+ return bswap_16(near_get_unaligned((const uint16_t *) ptr));
+}
+
+static inline uint16_t near_get_be16(const void *ptr)
+{
+ return near_get_unaligned((const uint16_t *) ptr);
+}
+
+static inline void near_put_le64(uint64_t val, const void *ptr)
+{
+ near_put_unaligned(bswap_64(val), (uint64_t *) ptr);
+}
+
+static inline void near_put_be64(uint64_t val, const void *ptr)
+{
+ near_put_unaligned(val, (uint64_t *) ptr);
+}
+
+static inline void near_put_le32(uint32_t val, const void *ptr)
+{
+ near_put_unaligned(bswap_32(val), (uint32_t *) ptr);
+}
+
+static inline void near_put_be32(uint32_t val, const void *ptr)
+{
+ near_put_unaligned(val, (uint32_t *) ptr);
+}
+
+static inline void near_put_le16(uint16_t val, const void *ptr)
+{
+ near_put_unaligned(bswap_16(val), (uint16_t *) ptr);
+}
+
+static inline void near_put_be16(uint16_t val, const void *ptr)
+{
+ near_put_unaligned(val, (uint16_t *) ptr);
+}
+#else
+#error "Unknown byte order"
+#endif
+
#endif
#define T4_ALL_ACCESS 0x00
#define T4_READ_ONLY 0xFF
-#define APDU_STATUS(a) (g_ntohs(*((uint16_t *)(a))))
+#define APDU_STATUS(a) near_get_be16(a)
/* Tag Type 4 version ID */
static uint8_t iso_appname_v1[] = { 0xd2, 0x76, 0x0, 0x0, 0x85, 0x01, 0x0 };
/* Add data to the tag */
err = near_tag_add_data(cookie->adapter_idx, cookie->target_idx, NULL,
- g_ntohs(*((uint16_t *)(resp + NFC_STATUS_BYTE_LEN))));
+ near_get_be16(resp + NFC_STATUS_BYTE_LEN));
if (err < 0)
return t4_cookie_release(err, cookie);
rec_header->payload_len = rec[offset++];
header_len++;
} else {
- rec_header->payload_len =
- g_ntohl(*((uint32_t *)(rec + offset)));
+ rec_header->payload_len = near_get_be32(rec + offset);
offset += 4;
header_len += 4;
if (rec_header->payload_len != 4)
goto fail;
- sp_payload->size =
- g_ntohl(*((uint32_t *)(payload + offset)));
+ sp_payload->size = near_get_be32(payload + offset);
break;
case RECORD_TYPE_WKT_TYPE:
return NULL;
/* Prepare ac message */
- *(uint16_t *)(cr_msg->data + cr_msg->offset) = g_htons(cr_id);
+ near_put_be16(cr_id, cr_msg->data + cr_msg->offset);
return cr_msg;
}
}
ho_payload->collision_record =
- g_ntohs(*((uint16_t *)(payload + offset)));
+ near_get_be16(payload + offset);
+
break;
case RECORD_TYPE_WKT_ALTERNATIVE_CARRIER:
if (RECORD_SR_BIT(hdr) == 1) {
ndef_size += ndef_in[offset++];
} else {
- ndef_size += g_ntohl(*((uint32_t *)(ndef_in + offset)));
+ ndef_size += near_get_be32(ndef_in + offset);
offset += 4;
if (offset >= ndef_in_length)