diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 22263631..1a1b8c3b 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -4,7 +4,9 @@ if(WITH_LIB_CPP) endif() set(C_SRC - actions.c + actions_publish.c + actions_subscribe.c + actions_unsubscribe.c alias_mosq.c alias_mosq.h callbacks.c connect.c diff --git a/lib/Makefile b/lib/Makefile index c7740e07..e9d0614f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -3,7 +3,9 @@ include ../config.mk .PHONY : really clean install MOSQ_OBJS=mosquitto.o \ - actions.o \ + actions_publish.o \ + actions_subscribe.o \ + actions_unsubscribe.o \ alias_mosq.o \ callbacks.o \ connect.o \ @@ -110,7 +112,13 @@ libmosquitto.a : ${MOSQ_OBJS} mosquitto.o : mosquitto.c ../include/mosquitto.h mosquitto_internal.h ${CROSS_COMPILE}$(CC) $(LIB_CPPFLAGS) $(LIB_CFLAGS) -c $< -o $@ -actions.o : actions.c ../include/mosquitto.h mosquitto_internal.h +actions_publish.o : actions_publish.c ../include/mosquitto.h mosquitto_internal.h + ${CROSS_COMPILE}$(CC) $(LIB_CPPFLAGS) $(LIB_CFLAGS) -c $< -o $@ + +actions_subscribe.o : actions_subscribe.c ../include/mosquitto.h mosquitto_internal.h + ${CROSS_COMPILE}$(CC) $(LIB_CPPFLAGS) $(LIB_CFLAGS) -c $< -o $@ + +actions_unsubscribe.o : actions_unsubscribe.c ../include/mosquitto.h mosquitto_internal.h ${CROSS_COMPILE}$(CC) $(LIB_CPPFLAGS) $(LIB_CFLAGS) -c $< -o $@ alias_mosq.o : alias_mosq.c alias_mosq.h ../include/mosquitto.h mosquitto_internal.h diff --git a/lib/actions.c b/lib/actions_publish.c similarity index 54% rename from lib/actions.c rename to lib/actions_publish.c index 5fa59877..a38eecd5 100644 --- a/lib/actions.c +++ b/lib/actions_publish.c @@ -18,15 +18,16 @@ Contributors: #include "config.h" +#include +#include #include -#include "mosquitto.h" -#include "mosquitto_internal.h" #include "memory_mosq.h" #include "messages_mosq.h" +#include "mosquitto_internal.h" #include "mqtt_protocol.h" -#include "net_mosq.h" #include "packet_mosq.h" +#include "property_mosq.h" #include "send_mosq.h" #include "util_mosq.h" @@ -161,119 +162,3 @@ int mosquitto_publish_v5(struct mosquitto *mosq, int *mid, const char *topic, in return rc; } } - - -int mosquitto_subscribe(struct mosquitto *mosq, int *mid, const char *sub, int qos) -{ - return mosquitto_subscribe_multiple(mosq, mid, 1, (char *const *const)&sub, qos, 0, NULL); -} - - -int mosquitto_subscribe_v5(struct mosquitto *mosq, int *mid, const char *sub, int qos, int options, const mosquitto_property *properties) -{ - return mosquitto_subscribe_multiple(mosq, mid, 1, (char *const *const)&sub, qos, options, properties); -} - - -int mosquitto_subscribe_multiple(struct mosquitto *mosq, int *mid, int sub_count, char *const *const sub, int qos, int options, const mosquitto_property *properties) -{ - const mosquitto_property *outgoing_properties = NULL; - mosquitto_property local_property; - int i; - int rc; - uint32_t remaining_length = 0; - int slen; - - if(!mosq || !sub_count || !sub) return MOSQ_ERR_INVAL; - if(mosq->protocol != mosq_p_mqtt5 && properties) return MOSQ_ERR_NOT_SUPPORTED; - if(qos < 0 || qos > 2) return MOSQ_ERR_INVAL; - if((options & 0x30) == 0x30 || (options & 0xC0) != 0) return MOSQ_ERR_INVAL; - if(!net__is_connected(mosq)) return MOSQ_ERR_NO_CONN; - - if(properties){ - if(properties->client_generated){ - outgoing_properties = properties; - }else{ - memcpy(&local_property, properties, sizeof(mosquitto_property)); - local_property.client_generated = true; - local_property.next = NULL; - outgoing_properties = &local_property; - } - rc = mosquitto_property_check_all(CMD_SUBSCRIBE, outgoing_properties); - if(rc) return rc; - } - - for(i=0; imaximum_packet_size > 0){ - remaining_length += 2 + property__get_length_all(outgoing_properties); - if(packet__check_oversize(mosq, remaining_length)){ - return MOSQ_ERR_OVERSIZE_PACKET; - } - } - if(mosq->protocol == mosq_p_mqtt311 || mosq->protocol == mosq_p_mqtt31){ - options = 0; - } - - return send__subscribe(mosq, mid, sub_count, sub, qos|options, outgoing_properties); -} - - -int mosquitto_unsubscribe(struct mosquitto *mosq, int *mid, const char *sub) -{ - return mosquitto_unsubscribe_multiple(mosq, mid, 1, (char *const *const)&sub, NULL); -} - -int mosquitto_unsubscribe_v5(struct mosquitto *mosq, int *mid, const char *sub, const mosquitto_property *properties) -{ - return mosquitto_unsubscribe_multiple(mosq, mid, 1, (char *const *const)&sub, properties); -} - -int mosquitto_unsubscribe_multiple(struct mosquitto *mosq, int *mid, int sub_count, char *const *const sub, const mosquitto_property *properties) -{ - const mosquitto_property *outgoing_properties = NULL; - mosquitto_property local_property; - int rc; - int i; - uint32_t remaining_length = 0; - int slen; - - if(!mosq) return MOSQ_ERR_INVAL; - if(mosq->protocol != mosq_p_mqtt5 && properties) return MOSQ_ERR_NOT_SUPPORTED; - if(!net__is_connected(mosq)) return MOSQ_ERR_NO_CONN; - - if(properties){ - if(properties->client_generated){ - outgoing_properties = properties; - }else{ - memcpy(&local_property, properties, sizeof(mosquitto_property)); - local_property.client_generated = true; - local_property.next = NULL; - outgoing_properties = &local_property; - } - rc = mosquitto_property_check_all(CMD_UNSUBSCRIBE, outgoing_properties); - if(rc) return rc; - } - - for(i=0; imaximum_packet_size > 0){ - remaining_length += 2U + property__get_length_all(outgoing_properties); - if(packet__check_oversize(mosq, remaining_length)){ - return MOSQ_ERR_OVERSIZE_PACKET; - } - } - - return send__unsubscribe(mosq, mid, sub_count, sub, outgoing_properties); -} - diff --git a/lib/actions_subscribe.c b/lib/actions_subscribe.c new file mode 100644 index 00000000..e8a331c2 --- /dev/null +++ b/lib/actions_subscribe.c @@ -0,0 +1,87 @@ +/* +Copyright (c) 2010-2021 Roger Light + +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License 2.0 +and Eclipse Distribution License v1.0 which accompany this distribution. + +The Eclipse Public License is available at + https://www.eclipse.org/legal/epl-2.0/ +and the Eclipse Distribution License is available at + http://www.eclipse.org/org/documents/edl-v10.php. + +SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause + +Contributors: + Roger Light - initial implementation and documentation. +*/ + +#include "config.h" + +#include + +#include "mqtt_protocol.h" +#include "net_mosq.h" +#include "packet_mosq.h" +#include "send_mosq.h" + + +int mosquitto_subscribe(struct mosquitto *mosq, int *mid, const char *sub, int qos) +{ + return mosquitto_subscribe_multiple(mosq, mid, 1, (char *const *const)&sub, qos, 0, NULL); +} + + +int mosquitto_subscribe_v5(struct mosquitto *mosq, int *mid, const char *sub, int qos, int options, const mosquitto_property *properties) +{ + return mosquitto_subscribe_multiple(mosq, mid, 1, (char *const *const)&sub, qos, options, properties); +} + + +int mosquitto_subscribe_multiple(struct mosquitto *mosq, int *mid, int sub_count, char *const *const sub, int qos, int options, const mosquitto_property *properties) +{ + const mosquitto_property *outgoing_properties = NULL; + mosquitto_property local_property; + int i; + int rc; + uint32_t remaining_length = 0; + int slen; + + if(!mosq || !sub_count || !sub) return MOSQ_ERR_INVAL; + if(mosq->protocol != mosq_p_mqtt5 && properties) return MOSQ_ERR_NOT_SUPPORTED; + if(qos < 0 || qos > 2) return MOSQ_ERR_INVAL; + if((options & 0x30) == 0x30 || (options & 0xC0) != 0) return MOSQ_ERR_INVAL; + if(!net__is_connected(mosq)) return MOSQ_ERR_NO_CONN; + + if(properties){ + if(properties->client_generated){ + outgoing_properties = properties; + }else{ + memcpy(&local_property, properties, sizeof(mosquitto_property)); + local_property.client_generated = true; + local_property.next = NULL; + outgoing_properties = &local_property; + } + rc = mosquitto_property_check_all(CMD_SUBSCRIBE, outgoing_properties); + if(rc) return rc; + } + + for(i=0; imaximum_packet_size > 0){ + remaining_length += 2 + property__get_length_all(outgoing_properties); + if(packet__check_oversize(mosq, remaining_length)){ + return MOSQ_ERR_OVERSIZE_PACKET; + } + } + if(mosq->protocol == mosq_p_mqtt311 || mosq->protocol == mosq_p_mqtt31){ + options = 0; + } + + return send__subscribe(mosq, mid, sub_count, sub, qos|options, outgoing_properties); +} diff --git a/lib/actions_unsubscribe.c b/lib/actions_unsubscribe.c new file mode 100644 index 00000000..2262c794 --- /dev/null +++ b/lib/actions_unsubscribe.c @@ -0,0 +1,82 @@ +/* +Copyright (c) 2010-2021 Roger Light + +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License 2.0 +and Eclipse Distribution License v1.0 which accompany this distribution. + +The Eclipse Public License is available at + https://www.eclipse.org/legal/epl-2.0/ +and the Eclipse Distribution License is available at + http://www.eclipse.org/org/documents/edl-v10.php. + +SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause + +Contributors: + Roger Light - initial implementation and documentation. +*/ + +#include "config.h" + +#include +#include + +#include "mqtt_protocol.h" +#include "net_mosq.h" +#include "packet_mosq.h" +#include "property_mosq.h" +#include "send_mosq.h" + + +int mosquitto_unsubscribe(struct mosquitto *mosq, int *mid, const char *sub) +{ + return mosquitto_unsubscribe_multiple(mosq, mid, 1, (char *const *const)&sub, NULL); +} + +int mosquitto_unsubscribe_v5(struct mosquitto *mosq, int *mid, const char *sub, const mosquitto_property *properties) +{ + return mosquitto_unsubscribe_multiple(mosq, mid, 1, (char *const *const)&sub, properties); +} + +int mosquitto_unsubscribe_multiple(struct mosquitto *mosq, int *mid, int sub_count, char *const *const sub, const mosquitto_property *properties) +{ + const mosquitto_property *outgoing_properties = NULL; + mosquitto_property local_property; + int rc; + int i; + uint32_t remaining_length = 0; + int slen; + + if(!mosq) return MOSQ_ERR_INVAL; + if(mosq->protocol != mosq_p_mqtt5 && properties) return MOSQ_ERR_NOT_SUPPORTED; + if(!net__is_connected(mosq)) return MOSQ_ERR_NO_CONN; + + if(properties){ + if(properties->client_generated){ + outgoing_properties = properties; + }else{ + memcpy(&local_property, properties, sizeof(mosquitto_property)); + local_property.client_generated = true; + local_property.next = NULL; + outgoing_properties = &local_property; + } + rc = mosquitto_property_check_all(CMD_UNSUBSCRIBE, outgoing_properties); + if(rc) return rc; + } + + for(i=0; imaximum_packet_size > 0){ + remaining_length += 2U + property__get_length_all(outgoing_properties); + if(packet__check_oversize(mosq, remaining_length)){ + return MOSQ_ERR_OVERSIZE_PACKET; + } + } + + return send__unsubscribe(mosq, mid, sub_count, sub, outgoing_properties); +}