#include "global.h" #include "rtlm.h" struct tagCallbacks call; /* * mqttLog() Log message to syslog * * @fmt = format string * @... = argument list * return: none */ void mqttLog(const char *fmt, ...) { va_list lst; va_start(lst, fmt); vsyslog(LOG_ERR, fmt, lst); va_end(lst); } void * mqttLoadRTLM(cfg_root_t *cfg, int modtype) { const char *str, *attr; void *rtlm = NULL; void *(*mqttOpenRTLM)(cfg_root_t *); void (*mqttCloseRTLM)(void *); if (!cfg) return NULL; switch (modtype) { case 0: attr = "acc_file"; break; case 1: attr = "pub_file"; break; default: attr = "log_file"; break; } str = cfg_getAttribute(cfg, "mqttd", attr); if (!str) { mqttLog("Error:: RTL module not found\n"); return NULL; } rtlm = dlopen(str, RTLD_NOW); if (!rtlm) { mqttLog("Error:: RTL module %s not found %s\n", str, dlerror()); return NULL; } mqttOpenRTLM = dlsym(rtlm, "mqtt_rtlm_open"); if (!mqttOpenRTLM) { mqttLog("Error:: Can't found mqtt_rtlm_open call\n"); dlclose(rtlm); return NULL; } mqttCloseRTLM = dlsym(rtlm, "mqtt_rtlm_close"); if (!mqttCloseRTLM) { mqttLog("Error:: Can't found mqtt_rtlm_close call\n"); dlclose(rtlm); return NULL; } switch (modtype) { case 0: call.OpenACC = mqttOpenRTLM; call.CloseACC = mqttCloseRTLM; call.LoginACC = dlsym(rtlm, "mqtt_rtlm_login"); if (!call.LoginACC) { mqttLog("Error:: incorrect module ...\n"); dlclose(rtlm); return NULL; } break; case 1: call.OpenPUB = mqttOpenRTLM; call.ClosePUB = mqttCloseRTLM; call.InitSessPUB = dlsym(rtlm, "mqtt_rtlm_init_session"); call.FiniSessPUB = dlsym(rtlm, "mqtt_rtlm_fini_session"); call.ChkSessPUB = dlsym(rtlm, "mqtt_rtlm_chk_session"); call.WritePUB_topic = dlsym(rtlm, "mqtt_rtlm_write_topic"); call.ReadPUB_topic = dlsym(rtlm, "mqtt_rtlm_read_topic"); call.DeletePUB_topic = dlsym(rtlm, "mqtt_rtlm_delete_topic"); call.WipePUB_topic = dlsym(rtlm, "mqtt_rtlm_wipe_topic"); call.WritePUB_subscribe = dlsym(rtlm, "mqtt_rtlm_write_subscribe"); call.ReadPUB_subscribe = dlsym(rtlm, "mqtt_rtlm_read_subscribe"); call.DeletePUB_subscribe = dlsym(rtlm, "mqtt_rtlm_delete_subscribe"); if (!call.InitSessPUB || !call.FiniSessPUB || !call.ChkSessPUB || !call.WritePUB_topic || !call.ReadPUB_topic || !call.DeletePUB_topic || !call.WritePUB_subscribe || !call.ReadPUB_subscribe || !call.DeletePUB_subscribe) { mqttLog("Error:: incorrect module ...\n"); dlclose(rtlm); return NULL; } break; default: call.OpenLOG = mqttOpenRTLM; call.CloseLOG = mqttCloseRTLM; call.LOG = dlsym(rtlm, "mqtt_rtlm_logger"); if (!call.LOG) { mqttLog("Error:: incorrect module ...\n"); dlclose(rtlm); return NULL; } break; } return rtlm; } void mqttUnloadRTLM(void *rtlm) { if (rtlm) dlclose(rtlm); } inline int mqttMkDir(cfg_root_t *cfg) { const char *str; if (!cfg) return -1; str = (const char*) cfg_getAttribute(cfg, "mqttd", "statedir"); if (!str) return -1; if (mkdir(str, 0600) == -1 && errno != EEXIST) return -1; return 0; }