1: #include "global.h"
2: #include "rtlm.h"
3:
4:
5: static void *acc_rtlm, *pub_rtlm, *log_rtlm;
6:
7: struct tagCallbacks call;
8:
9:
10: /*
11: * mqttLog() Log message to syslog
12: *
13: * @fmt = format string
14: * @... = argument list
15: * return: none
16: */
17: void
18: mqttLog(const char *fmt, ...)
19: {
20: va_list lst;
21:
22: va_start(lst, fmt);
23: vsyslog(LOG_ERR, fmt, lst);
24: va_end(lst);
25: }
26:
27: void *
28: mqttLoadRTLM(sl_config *cfg, int modtype)
29: {
30: const char *str, *attr;
31: void *rtlm = NULL;
32: void *(*mqttOpenRTLM)(sl_config *);
33: void (*mqttCloseRTLM)(void *);
34:
35: if (!cfg)
36: return NULL;
37:
38: switch (modtype) {
39: case 0:
40: attr = "acc_file";
41: break;
42: case 1:
43: attr = "pub_file";
44: break;
45: default:
46: attr = "log_file";
47: break;
48: }
49:
50: str = (const char*) CFG(cfg_GetAttribute(cfg, CFG("mqttd"), CFG(attr)));
51: if (!str) {
52: mqttLog("Error:: RTL module not found\n");
53: return NULL;
54: }
55:
56: rtlm = dlopen(str, RTLD_LAZY);
57: if (!rtlm) {
58: mqttLog("Error:: RTL module not found %s\n", dlerror());
59: return NULL;
60: }
61:
62: mqttOpenRTLM = dlsym(rtlm, "mqtt_rtlm_open");
63: if (!mqttOpenRTLM) {
64: mqttLog("Error:: Can't found mqtt_db_open call\n");
65: dlclose(rtlm);
66: return NULL;
67: }
68: mqttCloseRTLM = dlsym(rtlm, "mqtt_rtlm_close");
69: if (!mqttCloseRTLM) {
70: mqttLog("Error:: Can't found mqtt_db_close call\n");
71: dlclose(rtlm);
72: return NULL;
73: }
74:
75: switch (modtype) {
76: case 0:
77: acc_rtlm = rtlm;
78: call.OpenACC = mqttOpenRTLM;
79: call.CloseACC = mqttCloseRTLM;
80: break;
81: case 1:
82: pub_rtlm = rtlm;
83: call.OpenPUB = mqttOpenRTLM;
84: call.ClosePUB = mqttCloseRTLM;
85: break;
86: default:
87: log_rtlm = rtlm;
88: call.OpenLOG = mqttOpenRTLM;
89: call.CloseLOG = mqttCloseRTLM;
90: call.LOG = dlsym(rtlm, "mqtt_rtlm_logger");
91: break;
92: }
93:
94: return rtlm;
95: }
96:
97: void
98: mqttUnloadRTLM(int modtype)
99: {
100: switch (modtype) {
101: case 0:
102: dlclose(acc_rtlm);
103: break;
104: case 1:
105: dlclose(pub_rtlm);
106: break;
107: default:
108: dlclose(log_rtlm);
109: break;
110: }
111: }
112:
113: inline int
114: mqttMkDir(sl_config *cfg)
115: {
116: const char *str;
117:
118: if (!cfg)
119: return -1;
120:
121: str = (const char*) cfg_GetAttribute(cfg, CFG("mqttd"), CFG("statedir"));
122: if (!str)
123: return -1;
124:
125: if (mkdir(str, 0600) == -1 && errno != EEXIST)
126: return -1;
127:
128: return 0;
129: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>