#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;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>