diff --git a/Makefile.linux b/Makefile.linux index 1e04a90..4e134be 100644 --- a/Makefile.linux +++ b/Makefile.linux @@ -10,16 +10,21 @@ PLATFORM_FLAGS= AR=ar 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 DEBUG_FLAGS=-DDEBUG=1 $(COVERAGE_FLAGS) all: $(TARGET) $(DEBUG_TARGET) -test: $(DEBUG_TARGET) +test: + $(MAKE) EXTRA_CFLAGS="-DMQTT_SERVER=1 -DMQTT_CLIENT=1" clean all $(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 rm -rf coverage mkdir -p coverage @@ -45,5 +50,7 @@ clean: rm -f $(OBJS) $(DEBUG_OBJS) rm -f $(COVERAGE_FILES) rm -f *.gcov - rm -f lcov.info rm -rf docs/ + rm -rf coverage/ + +.PHONY: coverage test diff --git a/src/mqtt.h b/src/mqtt.h index 55e7247..6dfa4df 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -1,6 +1,17 @@ #ifndef 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 #include diff --git a/src/packet.c b/src/packet.c index e2851ac..8a5df12 100644 --- a/src/packet.c +++ b/src/packet.c @@ -149,6 +149,7 @@ size_t utf8_string_encode(char *string, Buffer *buffer) { * Decoder */ +#if MQTT_SERVER bool decode_connect(Buffer *buffer, ConnectPayload *payload) { // Validate this is actually a connect packet char template[] = { 0x00, 0x04, 'M', 'Q', 'T', 'T' }; @@ -186,6 +187,7 @@ bool decode_connect(Buffer *buffer, ConnectPayload *payload) { return true; } +#endif /* MQTT_SERVER */ bool decode_connack(Buffer *buffer, ConnAckPayload *payload) { payload->session_present = buffer->data[buffer->position++] & 0x01; @@ -227,6 +229,7 @@ bool decode_packet_id(Buffer *buffer, PacketIDPayload *payload) { return true; } +#if MQTT_SERVER bool decode_subscribe(Buffer *buffer, SubscribePayload *payload) { payload->packet_id = (buffer->data[buffer->position] << 8) @@ -238,6 +241,7 @@ bool decode_subscribe(Buffer *buffer, SubscribePayload *payload) { return true; } +#endif /* MQTT_SERVER */ bool decode_suback(Buffer *buffer, SubAckPayload *payload) { payload->packet_id = @@ -250,6 +254,7 @@ bool decode_suback(Buffer *buffer, SubAckPayload *payload) { return true; } +#if MQTT_SERVER bool decode_unsubscribe(Buffer *buffer, UnsubscribePayload *payload) { payload->packet_id = (buffer->data[buffer->position] << 8) @@ -260,6 +265,7 @@ bool decode_unsubscribe(Buffer *buffer, UnsubscribePayload *payload) { return true; } +#endif /* MQTT_SERVER */ MQTTPacket *mqtt_packet_decode(Buffer *buffer) { @@ -275,24 +281,15 @@ MQTTPacket *mqtt_packet_decode(Buffer *buffer) { bool valid = false; switch (type) { - case PacketTypeConnect: - valid = decode_connect(buffer, result->payload); - break; case PacketTypeConnAck: valid = decode_connack(buffer, result->payload); break; case PacketTypePublish: valid = decode_publish(buffer, result->payload, packet_size); break; - case PacketTypeSubscribe: - valid = decode_subscribe(buffer, result->payload); - break; case PacketTypeSubAck: valid = decode_suback(buffer, result->payload); break; - case PacketTypeUnsubscribe: - valid = decode_unsubscribe(buffer, result->payload); - break; case PacketTypePubAck: case PacketTypePubRec: case PacketTypePubRel: @@ -300,11 +297,29 @@ MQTTPacket *mqtt_packet_decode(Buffer *buffer) { case PacketTypeUnsubAck: valid = decode_packet_id(buffer, result->payload); break; - case PacketTypePingReq: case PacketTypePingResp: case PacketTypeDisconnect: valid = true; // there is no payload 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) { @@ -396,6 +411,7 @@ Buffer *encode_connect(ConnectPayload *payload) { return buffer; } +#if MQTT_SERVER Buffer *encode_connack(ConnAckPayload *payload) { size_t sz = 2; // session flag and status @@ -406,6 +422,7 @@ Buffer *encode_connack(ConnAckPayload *payload) { assert(buffer_eof(buffer)); return buffer; } +#endif /* MQTT_SERVER */ Buffer *encode_publish(PublishPayload *payload) { size_t sz = 0; @@ -477,6 +494,7 @@ Buffer *encode_subscribe(SubscribePayload *payload) { return buffer; } +#if MQTT_SERVER Buffer *encode_suback(SubAckPayload *payload) { size_t sz = 2; // packet id sz += 1; // Status code @@ -493,6 +511,7 @@ Buffer *encode_suback(SubAckPayload *payload) { assert(buffer_eof(buffer)); return buffer; } +#endif /* MQTT_SERVER */ Buffer *encode_unsubscribe(UnsubscribePayload *payload) { size_t sz = 2; // packet id @@ -522,29 +541,35 @@ Buffer *mqtt_packet_encode(MQTTPacket *packet) { switch (packet->packet_type) { case PacketTypeConnect: return encode_connect((ConnectPayload *)packet->payload); - case PacketTypeConnAck: - return encode_connack((ConnAckPayload *)packet->payload); case PacketTypePublish: return encode_publish((PublishPayload *)packet->payload); case PacketTypeSubscribe: return encode_subscribe((SubscribePayload *)packet->payload); - case PacketTypeSubAck: - return encode_suback((SubAckPayload *)packet->payload); case PacketTypeUnsubscribe: return encode_unsubscribe((UnsubscribePayload *)packet->payload); case PacketTypePubAck: case PacketTypePubRec: case PacketTypePubRel: case PacketTypePubComp: - case PacketTypeUnsubAck: return encode_packet_id((PacketIDPayload *)packet->payload, packet->packet_type); case PacketTypePingReq: - case PacketTypePingResp: case PacketTypeDisconnect: 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; + } } /* diff --git a/src/protocol.c b/src/protocol.c index bc81b30..523fa09 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -20,6 +20,7 @@ bool send_buffer(MQTTHandle *handle, Buffer *buffer) { return true; } +#if MQTT_CLIENT bool send_connect_packet(MQTTHandle *handle) { ConnectPayload *payload = calloc(1, sizeof(ConnectPayload)); @@ -44,6 +45,7 @@ bool send_connect_packet(MQTTHandle *handle) { encoded->position = 0; return send_buffer(handle, encoded); } +#endif /* MQTT_CLIENT */ void remove_pending(MQTTHandle *handle, void *context) { SubscribePayload *payload = (SubscribePayload *)context; @@ -54,6 +56,7 @@ void remove_pending(MQTTHandle *handle, void *context) { free(payload); } +#if MQTT_CLIENT bool send_subscribe_packet(MQTTHandle *handle, char *topic, MQTTQosLevel qos) { SubscribePayload *payload = calloc(1, sizeof(SubscribePayload)); @@ -69,7 +72,9 @@ bool send_subscribe_packet(MQTTHandle *handle, char *topic, MQTTQosLevel qos) { encoded->position = 0; return send_buffer(handle, encoded); } +#endif /* MQTT_CLIENT */ +#if MQTT_CLIENT bool send_unsubscribe_packet(MQTTHandle *handle, char *topic) { UnsubscribePayload *payload = calloc(1, sizeof(UnsubscribePayload)); @@ -85,6 +90,7 @@ bool send_unsubscribe_packet(MQTTHandle *handle, char *topic) { encoded->position = 0; return send_buffer(handle, encoded); } +#endif /* MQTT_CLIENT */ void handle_pubrec(MQTTHandle *handle, void *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); } +#if MQTT_CLIENT bool send_disconnect_packet(MQTTHandle *handle) { Buffer *encoded = mqtt_packet_encode(&(MQTTPacket){ PacketTypeDisconnect, NULL }); encoded->position = 0; return send_buffer(handle, encoded); } +#endif /* MQTT_CLIENT */ diff --git a/src/protocol.h b/src/protocol.h index f7ae3e8..800554a 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -3,10 +3,13 @@ #include "mqtt.h" +#if MQTT_CLIENT bool send_connect_packet(MQTTHandle *handle); bool send_subscribe_packet(MQTTHandle *handle, char *topic, MQTTQosLevel qos); 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); +#endif /* MQTT_CLIENT */ + +bool send_publish_packet(MQTTHandle *handle, char *topic, char *message, MQTTQosLevel qos); #endif