Hide server-only functionality for client builds and vice versa.
Coverage and Test targets forcefully enable both sides to do their things. Re #17
This commit is contained in:
parent
7123331e6d
commit
7a2f11d76b
5 changed files with 77 additions and 23 deletions
|
@ -10,16 +10,21 @@ PLATFORM_FLAGS=
|
||||||
|
|
||||||
AR=ar
|
AR=ar
|
||||||
CC=gcc
|
CC=gcc
|
||||||
CFLAGS=-g -Os -Wall -pthread -I./platform -I./src $(PLATFORM_FLAGS)
|
EXTRA_CFLAGS=
|
||||||
|
CFLAGS=-g -Os -Wall -pthread -I./platform -I./src $(EXTRA_CFLAGS) $(PLATFORM_FLAGS)
|
||||||
COVERAGE_FLAGS=-fprofile-arcs -ftest-coverage
|
COVERAGE_FLAGS=-fprofile-arcs -ftest-coverage
|
||||||
DEBUG_FLAGS=-DDEBUG=1 $(COVERAGE_FLAGS)
|
DEBUG_FLAGS=-DDEBUG=1 $(COVERAGE_FLAGS)
|
||||||
|
|
||||||
all: $(TARGET) $(DEBUG_TARGET)
|
all: $(TARGET) $(DEBUG_TARGET)
|
||||||
|
|
||||||
test: $(DEBUG_TARGET)
|
test:
|
||||||
|
$(MAKE) EXTRA_CFLAGS="-DMQTT_SERVER=1 -DMQTT_CLIENT=1" clean all
|
||||||
$(MAKE) -C tests
|
$(MAKE) -C tests
|
||||||
|
$(MAKE) clean
|
||||||
|
|
||||||
coverage: test
|
coverage:
|
||||||
|
$(MAKE) EXTRA_CFLAGS="-DMQTT_SERVER=1 -DMQTT_CLIENT=1" clean all
|
||||||
|
$(MAKE) DEBUG_FLAGS= -C tests clean all
|
||||||
lcov --capture --directory . --output-file lcov.info
|
lcov --capture --directory . --output-file lcov.info
|
||||||
rm -rf coverage
|
rm -rf coverage
|
||||||
mkdir -p coverage
|
mkdir -p coverage
|
||||||
|
@ -45,5 +50,7 @@ clean:
|
||||||
rm -f $(OBJS) $(DEBUG_OBJS)
|
rm -f $(OBJS) $(DEBUG_OBJS)
|
||||||
rm -f $(COVERAGE_FILES)
|
rm -f $(COVERAGE_FILES)
|
||||||
rm -f *.gcov
|
rm -f *.gcov
|
||||||
rm -f lcov.info
|
|
||||||
rm -rf docs/
|
rm -rf docs/
|
||||||
|
rm -rf coverage/
|
||||||
|
|
||||||
|
.PHONY: coverage test
|
||||||
|
|
11
src/mqtt.h
11
src/mqtt.h
|
@ -1,6 +1,17 @@
|
||||||
#ifndef mqtt_h__included
|
#ifndef mqtt_h__included
|
||||||
#define mqtt_h__included
|
#define mqtt_h__included
|
||||||
|
|
||||||
|
// re-define to 1 to enable server functionality
|
||||||
|
#ifndef MQTT_SERVER
|
||||||
|
# define MQTT_SERVER 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// re-rdefine to 0 to disable client functionality
|
||||||
|
#ifndef MQTT_CLIENT
|
||||||
|
# define MQTT_CLIENT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
|
61
src/packet.c
61
src/packet.c
|
@ -149,6 +149,7 @@ size_t utf8_string_encode(char *string, Buffer *buffer) {
|
||||||
* Decoder
|
* Decoder
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if MQTT_SERVER
|
||||||
bool decode_connect(Buffer *buffer, ConnectPayload *payload) {
|
bool decode_connect(Buffer *buffer, ConnectPayload *payload) {
|
||||||
// Validate this is actually a connect packet
|
// Validate this is actually a connect packet
|
||||||
char template[] = { 0x00, 0x04, 'M', 'Q', 'T', 'T' };
|
char template[] = { 0x00, 0x04, 'M', 'Q', 'T', 'T' };
|
||||||
|
@ -186,6 +187,7 @@ bool decode_connect(Buffer *buffer, ConnectPayload *payload) {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif /* MQTT_SERVER */
|
||||||
|
|
||||||
bool decode_connack(Buffer *buffer, ConnAckPayload *payload) {
|
bool decode_connack(Buffer *buffer, ConnAckPayload *payload) {
|
||||||
payload->session_present = buffer->data[buffer->position++] & 0x01;
|
payload->session_present = buffer->data[buffer->position++] & 0x01;
|
||||||
|
@ -227,6 +229,7 @@ bool decode_packet_id(Buffer *buffer, PacketIDPayload *payload) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if MQTT_SERVER
|
||||||
bool decode_subscribe(Buffer *buffer, SubscribePayload *payload) {
|
bool decode_subscribe(Buffer *buffer, SubscribePayload *payload) {
|
||||||
payload->packet_id =
|
payload->packet_id =
|
||||||
(buffer->data[buffer->position] << 8)
|
(buffer->data[buffer->position] << 8)
|
||||||
|
@ -238,6 +241,7 @@ bool decode_subscribe(Buffer *buffer, SubscribePayload *payload) {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif /* MQTT_SERVER */
|
||||||
|
|
||||||
bool decode_suback(Buffer *buffer, SubAckPayload *payload) {
|
bool decode_suback(Buffer *buffer, SubAckPayload *payload) {
|
||||||
payload->packet_id =
|
payload->packet_id =
|
||||||
|
@ -250,6 +254,7 @@ bool decode_suback(Buffer *buffer, SubAckPayload *payload) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if MQTT_SERVER
|
||||||
bool decode_unsubscribe(Buffer *buffer, UnsubscribePayload *payload) {
|
bool decode_unsubscribe(Buffer *buffer, UnsubscribePayload *payload) {
|
||||||
payload->packet_id =
|
payload->packet_id =
|
||||||
(buffer->data[buffer->position] << 8)
|
(buffer->data[buffer->position] << 8)
|
||||||
|
@ -260,6 +265,7 @@ bool decode_unsubscribe(Buffer *buffer, UnsubscribePayload *payload) {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif /* MQTT_SERVER */
|
||||||
|
|
||||||
|
|
||||||
MQTTPacket *mqtt_packet_decode(Buffer *buffer) {
|
MQTTPacket *mqtt_packet_decode(Buffer *buffer) {
|
||||||
|
@ -275,24 +281,15 @@ MQTTPacket *mqtt_packet_decode(Buffer *buffer) {
|
||||||
|
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case PacketTypeConnect:
|
|
||||||
valid = decode_connect(buffer, result->payload);
|
|
||||||
break;
|
|
||||||
case PacketTypeConnAck:
|
case PacketTypeConnAck:
|
||||||
valid = decode_connack(buffer, result->payload);
|
valid = decode_connack(buffer, result->payload);
|
||||||
break;
|
break;
|
||||||
case PacketTypePublish:
|
case PacketTypePublish:
|
||||||
valid = decode_publish(buffer, result->payload, packet_size);
|
valid = decode_publish(buffer, result->payload, packet_size);
|
||||||
break;
|
break;
|
||||||
case PacketTypeSubscribe:
|
|
||||||
valid = decode_subscribe(buffer, result->payload);
|
|
||||||
break;
|
|
||||||
case PacketTypeSubAck:
|
case PacketTypeSubAck:
|
||||||
valid = decode_suback(buffer, result->payload);
|
valid = decode_suback(buffer, result->payload);
|
||||||
break;
|
break;
|
||||||
case PacketTypeUnsubscribe:
|
|
||||||
valid = decode_unsubscribe(buffer, result->payload);
|
|
||||||
break;
|
|
||||||
case PacketTypePubAck:
|
case PacketTypePubAck:
|
||||||
case PacketTypePubRec:
|
case PacketTypePubRec:
|
||||||
case PacketTypePubRel:
|
case PacketTypePubRel:
|
||||||
|
@ -300,11 +297,29 @@ MQTTPacket *mqtt_packet_decode(Buffer *buffer) {
|
||||||
case PacketTypeUnsubAck:
|
case PacketTypeUnsubAck:
|
||||||
valid = decode_packet_id(buffer, result->payload);
|
valid = decode_packet_id(buffer, result->payload);
|
||||||
break;
|
break;
|
||||||
case PacketTypePingReq:
|
|
||||||
case PacketTypePingResp:
|
case PacketTypePingResp:
|
||||||
case PacketTypeDisconnect:
|
case PacketTypeDisconnect:
|
||||||
valid = true; // there is no payload
|
valid = true; // there is no payload
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#if MQTT_SERVER
|
||||||
|
case PacketTypePingReq:
|
||||||
|
valid = true; // there is no payload
|
||||||
|
break;
|
||||||
|
case PacketTypeConnect:
|
||||||
|
valid = decode_connect(buffer, result->payload);
|
||||||
|
break;
|
||||||
|
case PacketTypeSubscribe:
|
||||||
|
valid = decode_subscribe(buffer, result->payload);
|
||||||
|
break;
|
||||||
|
case PacketTypeUnsubscribe:
|
||||||
|
valid = decode_unsubscribe(buffer, result->payload);
|
||||||
|
break;
|
||||||
|
#endif /* MQTT_SERVER */
|
||||||
|
|
||||||
|
default:
|
||||||
|
valid = false;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
|
@ -396,6 +411,7 @@ Buffer *encode_connect(ConnectPayload *payload) {
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if MQTT_SERVER
|
||||||
Buffer *encode_connack(ConnAckPayload *payload) {
|
Buffer *encode_connack(ConnAckPayload *payload) {
|
||||||
size_t sz = 2; // session flag and status
|
size_t sz = 2; // session flag and status
|
||||||
|
|
||||||
|
@ -406,6 +422,7 @@ Buffer *encode_connack(ConnAckPayload *payload) {
|
||||||
assert(buffer_eof(buffer));
|
assert(buffer_eof(buffer));
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
#endif /* MQTT_SERVER */
|
||||||
|
|
||||||
Buffer *encode_publish(PublishPayload *payload) {
|
Buffer *encode_publish(PublishPayload *payload) {
|
||||||
size_t sz = 0;
|
size_t sz = 0;
|
||||||
|
@ -477,6 +494,7 @@ Buffer *encode_subscribe(SubscribePayload *payload) {
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if MQTT_SERVER
|
||||||
Buffer *encode_suback(SubAckPayload *payload) {
|
Buffer *encode_suback(SubAckPayload *payload) {
|
||||||
size_t sz = 2; // packet id
|
size_t sz = 2; // packet id
|
||||||
sz += 1; // Status code
|
sz += 1; // Status code
|
||||||
|
@ -493,6 +511,7 @@ Buffer *encode_suback(SubAckPayload *payload) {
|
||||||
assert(buffer_eof(buffer));
|
assert(buffer_eof(buffer));
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
#endif /* MQTT_SERVER */
|
||||||
|
|
||||||
Buffer *encode_unsubscribe(UnsubscribePayload *payload) {
|
Buffer *encode_unsubscribe(UnsubscribePayload *payload) {
|
||||||
size_t sz = 2; // packet id
|
size_t sz = 2; // packet id
|
||||||
|
@ -522,29 +541,35 @@ Buffer *mqtt_packet_encode(MQTTPacket *packet) {
|
||||||
switch (packet->packet_type) {
|
switch (packet->packet_type) {
|
||||||
case PacketTypeConnect:
|
case PacketTypeConnect:
|
||||||
return encode_connect((ConnectPayload *)packet->payload);
|
return encode_connect((ConnectPayload *)packet->payload);
|
||||||
case PacketTypeConnAck:
|
|
||||||
return encode_connack((ConnAckPayload *)packet->payload);
|
|
||||||
case PacketTypePublish:
|
case PacketTypePublish:
|
||||||
return encode_publish((PublishPayload *)packet->payload);
|
return encode_publish((PublishPayload *)packet->payload);
|
||||||
case PacketTypeSubscribe:
|
case PacketTypeSubscribe:
|
||||||
return encode_subscribe((SubscribePayload *)packet->payload);
|
return encode_subscribe((SubscribePayload *)packet->payload);
|
||||||
case PacketTypeSubAck:
|
|
||||||
return encode_suback((SubAckPayload *)packet->payload);
|
|
||||||
case PacketTypeUnsubscribe:
|
case PacketTypeUnsubscribe:
|
||||||
return encode_unsubscribe((UnsubscribePayload *)packet->payload);
|
return encode_unsubscribe((UnsubscribePayload *)packet->payload);
|
||||||
case PacketTypePubAck:
|
case PacketTypePubAck:
|
||||||
case PacketTypePubRec:
|
case PacketTypePubRec:
|
||||||
case PacketTypePubRel:
|
case PacketTypePubRel:
|
||||||
case PacketTypePubComp:
|
case PacketTypePubComp:
|
||||||
case PacketTypeUnsubAck:
|
|
||||||
return encode_packet_id((PacketIDPayload *)packet->payload, packet->packet_type);
|
return encode_packet_id((PacketIDPayload *)packet->payload, packet->packet_type);
|
||||||
case PacketTypePingReq:
|
case PacketTypePingReq:
|
||||||
case PacketTypePingResp:
|
|
||||||
case PacketTypeDisconnect:
|
case PacketTypeDisconnect:
|
||||||
return encode_no_payload(packet->packet_type);
|
return encode_no_payload(packet->packet_type);
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
#if MQTT_SERVER
|
||||||
|
case PacketTypePingResp:
|
||||||
|
return encode_no_payload(packet->packet_type);
|
||||||
|
case PacketTypeUnsubAck:
|
||||||
|
return encode_packet_id((PacketIDPayload *)packet->payload, packet->packet_type);
|
||||||
|
case PacketTypeConnAck:
|
||||||
|
return encode_connack((ConnAckPayload *)packet->payload);
|
||||||
|
case PacketTypeSubAck:
|
||||||
|
return encode_suback((SubAckPayload *)packet->payload);
|
||||||
|
#endif /* MQTT_SERVER */
|
||||||
|
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -20,6 +20,7 @@ bool send_buffer(MQTTHandle *handle, Buffer *buffer) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if MQTT_CLIENT
|
||||||
bool send_connect_packet(MQTTHandle *handle) {
|
bool send_connect_packet(MQTTHandle *handle) {
|
||||||
ConnectPayload *payload = calloc(1, sizeof(ConnectPayload));
|
ConnectPayload *payload = calloc(1, sizeof(ConnectPayload));
|
||||||
|
|
||||||
|
@ -44,6 +45,7 @@ bool send_connect_packet(MQTTHandle *handle) {
|
||||||
encoded->position = 0;
|
encoded->position = 0;
|
||||||
return send_buffer(handle, encoded);
|
return send_buffer(handle, encoded);
|
||||||
}
|
}
|
||||||
|
#endif /* MQTT_CLIENT */
|
||||||
|
|
||||||
void remove_pending(MQTTHandle *handle, void *context) {
|
void remove_pending(MQTTHandle *handle, void *context) {
|
||||||
SubscribePayload *payload = (SubscribePayload *)context;
|
SubscribePayload *payload = (SubscribePayload *)context;
|
||||||
|
@ -54,6 +56,7 @@ void remove_pending(MQTTHandle *handle, void *context) {
|
||||||
free(payload);
|
free(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if MQTT_CLIENT
|
||||||
bool send_subscribe_packet(MQTTHandle *handle, char *topic, MQTTQosLevel qos) {
|
bool send_subscribe_packet(MQTTHandle *handle, char *topic, MQTTQosLevel qos) {
|
||||||
SubscribePayload *payload = calloc(1, sizeof(SubscribePayload));
|
SubscribePayload *payload = calloc(1, sizeof(SubscribePayload));
|
||||||
|
|
||||||
|
@ -69,7 +72,9 @@ bool send_subscribe_packet(MQTTHandle *handle, char *topic, MQTTQosLevel qos) {
|
||||||
encoded->position = 0;
|
encoded->position = 0;
|
||||||
return send_buffer(handle, encoded);
|
return send_buffer(handle, encoded);
|
||||||
}
|
}
|
||||||
|
#endif /* MQTT_CLIENT */
|
||||||
|
|
||||||
|
#if MQTT_CLIENT
|
||||||
bool send_unsubscribe_packet(MQTTHandle *handle, char *topic) {
|
bool send_unsubscribe_packet(MQTTHandle *handle, char *topic) {
|
||||||
UnsubscribePayload *payload = calloc(1, sizeof(UnsubscribePayload));
|
UnsubscribePayload *payload = calloc(1, sizeof(UnsubscribePayload));
|
||||||
|
|
||||||
|
@ -85,6 +90,7 @@ bool send_unsubscribe_packet(MQTTHandle *handle, char *topic) {
|
||||||
encoded->position = 0;
|
encoded->position = 0;
|
||||||
return send_buffer(handle, encoded);
|
return send_buffer(handle, encoded);
|
||||||
}
|
}
|
||||||
|
#endif /* MQTT_CLIENT */
|
||||||
|
|
||||||
void handle_pubrec(MQTTHandle *handle, void *context) {
|
void handle_pubrec(MQTTHandle *handle, void *context) {
|
||||||
PublishPayload *payload = (PublishPayload *)context;
|
PublishPayload *payload = (PublishPayload *)context;
|
||||||
|
@ -132,8 +138,10 @@ bool send_publish_packet(MQTTHandle *handle, char *topic, char *message, MQTTQos
|
||||||
return send_buffer(handle, encoded);
|
return send_buffer(handle, encoded);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if MQTT_CLIENT
|
||||||
bool send_disconnect_packet(MQTTHandle *handle) {
|
bool send_disconnect_packet(MQTTHandle *handle) {
|
||||||
Buffer *encoded = mqtt_packet_encode(&(MQTTPacket){ PacketTypeDisconnect, NULL });
|
Buffer *encoded = mqtt_packet_encode(&(MQTTPacket){ PacketTypeDisconnect, NULL });
|
||||||
encoded->position = 0;
|
encoded->position = 0;
|
||||||
return send_buffer(handle, encoded);
|
return send_buffer(handle, encoded);
|
||||||
}
|
}
|
||||||
|
#endif /* MQTT_CLIENT */
|
||||||
|
|
|
@ -3,10 +3,13 @@
|
||||||
|
|
||||||
#include "mqtt.h"
|
#include "mqtt.h"
|
||||||
|
|
||||||
|
#if MQTT_CLIENT
|
||||||
bool send_connect_packet(MQTTHandle *handle);
|
bool send_connect_packet(MQTTHandle *handle);
|
||||||
bool send_subscribe_packet(MQTTHandle *handle, char *topic, MQTTQosLevel qos);
|
bool send_subscribe_packet(MQTTHandle *handle, char *topic, MQTTQosLevel qos);
|
||||||
bool send_unsubscribe_packet(MQTTHandle *handle, char *topic);
|
bool send_unsubscribe_packet(MQTTHandle *handle, char *topic);
|
||||||
bool send_publish_packet(MQTTHandle *handle, char *topic, char *message, MQTTQosLevel qos);
|
|
||||||
bool send_disconnect_packet(MQTTHandle *handle);
|
bool send_disconnect_packet(MQTTHandle *handle);
|
||||||
|
#endif /* MQTT_CLIENT */
|
||||||
|
|
||||||
|
bool send_publish_packet(MQTTHandle *handle, char *topic, char *message, MQTTQosLevel qos);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue