Annotation of mqtt/src/dl.c, revision 1.1.2.12

1.1.2.1   misho       1: #include "global.h"
                      2: #include "rtlm.h"
                      3: 
                      4: 
1.1.2.4   misho       5: static void *acc_rtlm, *pub_rtlm, *log_rtlm;
1.1.2.1   misho       6: 
1.1.2.5   misho       7: struct tagCallbacks call;
                      8: 
1.1.2.1   misho       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: {
1.1.2.4   misho      30:        const char *str, *attr;
1.1.2.1   misho      31:        void *rtlm = NULL;
1.1.2.4   misho      32:        void *(*mqttOpenRTLM)(sl_config *);
                     33:        void (*mqttCloseRTLM)(void *);
1.1.2.1   misho      34: 
                     35:        if (!cfg)
                     36:                return NULL;
                     37: 
1.1.2.4   misho      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)));
1.1.2.1   misho      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) {
1.1.2.12! misho      58:                mqttLog("Error:: RTL module %s not found %s\n", str, dlerror());
1.1.2.1   misho      59:                return NULL;
                     60:        }
                     61: 
1.1.2.4   misho      62:        mqttOpenRTLM = dlsym(rtlm, "mqtt_rtlm_open");
                     63:        if (!mqttOpenRTLM) {
1.1.2.1   misho      64:                mqttLog("Error:: Can't found mqtt_db_open call\n");
                     65:                dlclose(rtlm);
                     66:                return NULL;
                     67:        }
1.1.2.4   misho      68:        mqttCloseRTLM = dlsym(rtlm, "mqtt_rtlm_close");
                     69:        if (!mqttCloseRTLM) {
1.1.2.1   misho      70:                mqttLog("Error:: Can't found mqtt_db_close call\n");
                     71:                dlclose(rtlm);
                     72:                return NULL;
                     73:        }
                     74: 
1.1.2.4   misho      75:        switch (modtype) {
                     76:                case 0:
                     77:                        acc_rtlm = rtlm;
1.1.2.5   misho      78:                        call.OpenACC = mqttOpenRTLM;
                     79:                        call.CloseACC = mqttCloseRTLM;
1.1.2.6   misho      80:                        call.LoginACC = dlsym(rtlm, "mqtt_rtlm_login");
1.1.2.11  misho      81:                        if (!call.LoginACC) {
                     82:                                mqttLog("Error:: incorrect module ...\n");
                     83:                                dlclose(rtlm);
                     84:                                return NULL;
                     85:                        }
1.1.2.4   misho      86:                        break;
                     87:                case 1:
                     88:                        pub_rtlm = rtlm;
1.1.2.5   misho      89:                        call.OpenPUB = mqttOpenRTLM;
                     90:                        call.ClosePUB = mqttCloseRTLM;
1.1.2.7   misho      91:                        call.InitSessPUB = dlsym(rtlm, "mqtt_rtlm_init_session");
1.1.2.8   misho      92:                        call.FiniSessPUB = dlsym(rtlm, "mqtt_rtlm_fini_session");
1.1.2.9   misho      93:                        call.ChkSessPUB = dlsym(rtlm, "mqtt_rtlm_chk_session");
1.1.2.10  misho      94:                        call.WritePUB = dlsym(rtlm, "mqtt_rtlm_write_topic");
                     95:                        call.ReadPUB = dlsym(rtlm, "mqtt_rtlm_read_topic");
                     96:                        call.DeletePUB = dlsym(rtlm, "mqtt_rtlm_delete_topic");
1.1.2.11  misho      97:                        if (!call.InitSessPUB || !call.FiniSessPUB || !call.ChkSessPUB || 
                     98:                                        !call.WritePUB || !call.ReadPUB || !call.DeletePUB) {
                     99:                                mqttLog("Error:: incorrect module ...\n");
                    100:                                dlclose(rtlm);
                    101:                                return NULL;
                    102:                        }
1.1.2.4   misho     103:                        break;
                    104:                default:
                    105:                        log_rtlm = rtlm;
1.1.2.5   misho     106:                        call.OpenLOG = mqttOpenRTLM;
                    107:                        call.CloseLOG = mqttCloseRTLM;
                    108:                        call.LOG = dlsym(rtlm, "mqtt_rtlm_logger");
1.1.2.11  misho     109:                        if (!call.LOG) {
                    110:                                mqttLog("Error:: incorrect module ...\n");
                    111:                                dlclose(rtlm);
                    112:                                return NULL;
                    113:                        }
1.1.2.4   misho     114:                        break;
1.1.2.1   misho     115:        }
                    116: 
                    117:        return rtlm;
                    118: }
                    119: 
                    120: void
                    121: mqttUnloadRTLM(int modtype)
                    122: {
1.1.2.4   misho     123:        switch (modtype) {
                    124:                case 0:
                    125:                        dlclose(acc_rtlm);
                    126:                        break;
                    127:                case 1:
                    128:                        dlclose(pub_rtlm);
                    129:                        break;
                    130:                default:
                    131:                        dlclose(log_rtlm);
                    132:                        break;
                    133:        }
1.1.2.1   misho     134: }
1.1.2.2   misho     135: 
                    136: inline int
                    137: mqttMkDir(sl_config *cfg)
                    138: {
1.1.2.3   misho     139:        const char *str;
1.1.2.2   misho     140: 
                    141:        if (!cfg)
                    142:                return -1;
                    143: 
1.1.2.3   misho     144:        str = (const char*) cfg_GetAttribute(cfg, CFG("mqttd"), CFG("statedir"));
1.1.2.2   misho     145:        if (!str)
                    146:                return -1;
                    147: 
                    148:        if (mkdir(str, 0600) == -1 && errno != EEXIST)
                    149:                return -1;
                    150: 
                    151:        return 0;
                    152: }

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