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
|
||||
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
|
||||
|
|
11
src/mqtt.h
11
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 <stdint.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
|
||||
*/
|
||||
|
||||
#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;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue