File:  [ELWIX - Embedded LightWeight unIX -] / mqtt / src / dl.c
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Tue Jul 3 09:02:50 2012 UTC (11 years, 11 months ago) by misho
Branches: MAIN
CVS tags: mqtt1_2, MQTT1_1, HEAD
version 1.1

#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;
}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>