File:  [ELWIX - Embedded LightWeight unIX -] / mqtt / src / dl.c
Revision 1.2.2.7: download - view: text, annotated - select for diffs - revision graph
Fri Jun 1 11:39:15 2012 UTC (12 years, 1 month ago) by misho
Branches: mqtt1_1
fixed bug with sqlite3 stale connections

    1: #include "global.h"
    2: #include "rtlm.h"
    3: 
    4: 
    5: struct tagCallbacks call;
    6: 
    7: 
    8: /*
    9:  * mqttLog() Log message to syslog
   10:  *
   11:  * @fmt = format string
   12:  * @... = argument list
   13:  * return: none
   14:  */
   15: void
   16: mqttLog(const char *fmt, ...)
   17: {
   18: 	va_list lst;
   19: 
   20: 	va_start(lst, fmt);
   21: 	vsyslog(LOG_ERR, fmt, lst);
   22: 	va_end(lst);
   23: }
   24: 
   25: void *
   26: mqttLoadRTLM(cfg_root_t *cfg, int modtype)
   27: {
   28: 	const char *str, *attr;
   29: 	void *rtlm = NULL;
   30: 	void *(*mqttOpenRTLM)(cfg_root_t *);
   31: 	void (*mqttCloseRTLM)(void *);
   32: 
   33: 	if (!cfg)
   34: 		return NULL;
   35: 
   36: 	switch (modtype) {
   37: 		case 0:
   38: 			attr = "acc_file";
   39: 			break;
   40: 		case 1:
   41: 			attr = "pub_file";
   42: 			break;
   43: 		default:
   44: 			attr = "log_file";
   45: 			break;
   46: 	}
   47: 
   48: 	str = cfg_getAttribute(cfg, "mqttd", attr);
   49: 	if (!str) {
   50: 		mqttLog("Error:: RTL module not found\n");
   51: 		return NULL;
   52: 	}
   53: 
   54: 	rtlm = dlopen(str, RTLD_NOW);
   55: 	if (!rtlm) {
   56: 		mqttLog("Error:: RTL module %s not found %s\n", str, dlerror());
   57: 		return NULL;
   58: 	}
   59: 
   60: 	mqttOpenRTLM = dlsym(rtlm, "mqtt_rtlm_open");
   61: 	if (!mqttOpenRTLM) {
   62: 		mqttLog("Error:: Can't found mqtt_rtlm_open call\n");
   63: 		dlclose(rtlm);
   64: 		return NULL;
   65: 	}
   66: 	mqttCloseRTLM = dlsym(rtlm, "mqtt_rtlm_close");
   67: 	if (!mqttCloseRTLM) {
   68: 		mqttLog("Error:: Can't found mqtt_rtlm_close call\n");
   69: 		dlclose(rtlm);
   70: 		return NULL;
   71: 	}
   72: 
   73: 	switch (modtype) {
   74: 		case 0:
   75: 			call.OpenACC = mqttOpenRTLM;
   76: 			call.CloseACC = mqttCloseRTLM;
   77: 			call.LoginACC = dlsym(rtlm, "mqtt_rtlm_login");
   78: 			if (!call.LoginACC) {
   79: 				mqttLog("Error:: incorrect module ...\n");
   80: 				dlclose(rtlm);
   81: 				return NULL;
   82: 			}
   83: 			break;
   84: 		case 1:
   85: 			call.OpenPUB = mqttOpenRTLM;
   86: 			call.ClosePUB = mqttCloseRTLM;
   87: 			call.InitSessPUB = dlsym(rtlm, "mqtt_rtlm_init_session");
   88: 			call.FiniSessPUB = dlsym(rtlm, "mqtt_rtlm_fini_session");
   89: 			call.ChkSessPUB = dlsym(rtlm, "mqtt_rtlm_chk_session");
   90: 			call.WritePUB_topic = dlsym(rtlm, "mqtt_rtlm_write_topic");
   91: 			call.ReadPUB_topic = dlsym(rtlm, "mqtt_rtlm_read_topic");
   92: 			call.DeletePUB_topic = dlsym(rtlm, "mqtt_rtlm_delete_topic");
   93: 			call.WipePUB_topic = dlsym(rtlm, "mqtt_rtlm_wipe_topic");
   94: 			call.WritePUB_subscribe = dlsym(rtlm, "mqtt_rtlm_write_subscribe");
   95: 			call.ReadPUB_subscribe = dlsym(rtlm, "mqtt_rtlm_read_subscribe");
   96: 			call.DeletePUB_subscribe = dlsym(rtlm, "mqtt_rtlm_delete_subscribe");
   97: 			if (!call.InitSessPUB || !call.FiniSessPUB || !call.ChkSessPUB || 
   98: 					!call.WritePUB_topic || !call.ReadPUB_topic || 
   99: 					!call.DeletePUB_topic || !call.WritePUB_subscribe || 
  100: 					!call.ReadPUB_subscribe || !call.DeletePUB_subscribe) {
  101: 				mqttLog("Error:: incorrect module ...\n");
  102: 				dlclose(rtlm);
  103: 				return NULL;
  104: 			}
  105: 			break;
  106: 		default:
  107: 			call.OpenLOG = mqttOpenRTLM;
  108: 			call.CloseLOG = mqttCloseRTLM;
  109: 			call.LOG = dlsym(rtlm, "mqtt_rtlm_logger");
  110: 			if (!call.LOG) {
  111: 				mqttLog("Error:: incorrect module ...\n");
  112: 				dlclose(rtlm);
  113: 				return NULL;
  114: 			}
  115: 			break;
  116: 	}
  117: 
  118: 	return rtlm;
  119: }
  120: 
  121: void
  122: mqttUnloadRTLM(void *rtlm)
  123: {
  124: 	if (rtlm)
  125: 		dlclose(rtlm);
  126: }
  127: 
  128: inline int
  129: mqttMkDir(cfg_root_t *cfg)
  130: {
  131: 	const char *str;
  132: 
  133: 	if (!cfg)
  134: 		return -1;
  135: 
  136: 	str = (const char*) cfg_getAttribute(cfg, "mqttd", "statedir");
  137: 	if (!str)
  138: 		return -1;
  139: 
  140: 	if (mkdir(str, 0600) == -1 && errno != EEXIST)
  141: 		return -1;
  142: 
  143: 	return 0;
  144: }

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