From a59c42e5caa76a5ea1d5e79b7820a1a012f9a3a4 Mon Sep 17 00:00:00 2001 From: cbdev Date: Sat, 14 Nov 2020 15:21:53 +0100 Subject: MQTT backend skeleton --- backends/mqtt.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 backends/mqtt.c (limited to 'backends/mqtt.c') diff --git a/backends/mqtt.c b/backends/mqtt.c new file mode 100644 index 0000000..4f56aa6 --- /dev/null +++ b/backends/mqtt.c @@ -0,0 +1,108 @@ +#define BACKEND_NAME "mqtt" + +#include +#include "mqtt.h" + +MM_PLUGIN_API int init(){ + backend mqtt = { + .name = BACKEND_NAME, + .conf = mqtt_configure, + .create = mqtt_instance, + .conf_instance = mqtt_configure_instance, + .channel = mqtt_channel, + .handle = mqtt_set, + .process = mqtt_handle, + .start = mqtt_start, + .shutdown = mqtt_shutdown + }; + + //register backend + if(mm_backend_register(mqtt)){ + LOG("Failed to register backend"); + return 1; + } + return 0; +} + +static size_t mqtt_varint_decode(uint8_t* buffer, uint32_t* result){ + //TODO + return 0; +} + +static int mqtt_configure(char* option, char* value){ + LOG("This backend does not take global configuration"); + return 1; +} + +static int mqtt_configure_instance(instance* inst, char* option, char* value){ + mqtt_instance_data* data = (mqtt_instance_data*) inst->impl; + char* token = value; + + if(!strcmp(option, "user")){ + free(data->user); + data->user = strdup(value); + return 0; + } + else if(!strcmp(option, "password")){ + free(data->password); + data->user = strdup(value); + return 0; + } + else if(!strcmp(option, "host")){ + //mqtt url may be of the form + //mqtt[s]://[username][:password]@host.domain[:port] + token = strchr(value, ':'); + //TODO + } + + LOGPF("Unknown instance configuration option %s on instance %s", option, inst->name); + return 1; +} + +static int mqtt_instance(instance* inst){ + //TODO + return 0; +} + +static channel* mqtt_channel(instance* inst, char* spec, uint8_t flags){ + //TODO + return NULL; +} + +static int mqtt_set(instance* inst, size_t num, channel** c, channel_value* v){ + //TODO + return 0; +} + +static int mqtt_handle(size_t num, managed_fd* fds){ + //TODO + return 0; +} + +static int mqtt_start(size_t n, instance** inst){ + //TODO + return 0; +} + +static int mqtt_shutdown(size_t n, instance** inst){ + size_t u, p; + mqtt_instance_data* data = NULL; + + for(u = 0; u < n; u++){ + data = (mqtt_instance_data*) inst[u]->impl; + for(p = 0; p < data->nchannels; p++){ + free(data->channel[p]); + } + free(data->channel); + free(data->host); + free(data->port); + free(data->user); + free(data->password); + + free(inst[u]->impl); + inst[u]->impl = NULL; + } + + LOG("Backend shut down"); + return 0; +} -- cgit v1.2.3