#include "global.h" /* ------------------------------------------------------------------- */ /* * mqttInitCallbacks() Init callback array for dispatcher * * return: NULL error or !=NULL allocated callback array, after use free with mqttFiniCallbacks() */ mqtt_cb_t * mqttInitCallbacks(void) { mqtt_cb_t *cb = NULL; cb = malloc((MQTT_TYPE_MAX + 1) * sizeof(mqtt_cb_t)); if (!cb) { LOGERR; return NULL; } else memset(cb, 0, (MQTT_TYPE_MAX + 1) * sizeof(mqtt_cb_t)); return cb; } /* * mqttFiniCallbacks() Free callback array * * @cb = Callback array * return: none */ void mqttFiniCallbacks(mqtt_cb_t ** __restrict cb) { if (!cb) return; if ((*cb)[MQTT_TYPE_MAX]) (*cb)[MQTT_TYPE_MAX](*cb); free(*cb); *cb = NULL; } /* * mqttDispatcher() MQTT Message type dispatcher * * @cb = Callback array * @buf = Received MQTT message * return: -1 error or >-1 return value from executed callback */ inline int mqttDispatcher(mqtt_cb_t * __restrict cb, mqtt_msg_t * __restrict buf) { struct mqtthdr *hdr; if (!cb || !buf) return -1; if (buf->msg_len < sizeof(struct mqtthdr)) { mqtt_SetErr(EINVAL, "Error:: message is too small ..."); return -1; } hdr = (struct mqtthdr *) buf->msg_base; if (hdr->mqtt_msg.type > MQTT_TYPE_MAX) { mqtt_SetErr(ENOSYS, "Error:: message type %d not implemented", hdr->mqtt_msg.type); return -1; } if (cb[hdr->mqtt_msg.type]) return cb[hdr->mqtt_msg.type](buf); mqtt_SetErr(ENOTSUP, "Error:: Unsupported message type %d", hdr->mqtt_msg.type); return -1; }