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

1.2       misho       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 *
1.2.2.3   misho      28: mqttLoadRTLM(cfg_root_t *cfg, int modtype)
1.2       misho      29: {
                     30:        const char *str, *attr;
                     31:        void *rtlm = NULL;
1.2.2.3   misho      32:        void *(*mqttOpenRTLM)(cfg_root_t *);
1.2       misho      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: 
1.2.2.3   misho      50:        str = cfg_getAttribute(cfg, "mqttd", attr);
1.2       misho      51:        if (!str) {
                     52:                mqttLog("Error:: RTL module not found\n");
                     53:                return NULL;
                     54:        }
                     55: 
1.2.2.5 ! misho      56:        rtlm = dlopen(str, RTLD_NOW);
1.2       misho      57:        if (!rtlm) {
                     58:                mqttLog("Error:: RTL module %s not found %s\n", str, dlerror());
                     59:                return NULL;
                     60:        }
                     61: 
                     62:        mqttOpenRTLM = dlsym(rtlm, "mqtt_rtlm_open");
                     63:        if (!mqttOpenRTLM) {
1.2.2.4   misho      64:                mqttLog("Error:: Can't found mqtt_rtlm_open call\n");
1.2       misho      65:                dlclose(rtlm);
                     66:                return NULL;
                     67:        }
                     68:        mqttCloseRTLM = dlsym(rtlm, "mqtt_rtlm_close");
                     69:        if (!mqttCloseRTLM) {
1.2.2.4   misho      70:                mqttLog("Error:: Can't found mqtt_rtlm_close call\n");
1.2       misho      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:                        call.LoginACC = dlsym(rtlm, "mqtt_rtlm_login");
                     81:                        if (!call.LoginACC) {
                     82:                                mqttLog("Error:: incorrect module ...\n");
                     83:                                dlclose(rtlm);
                     84:                                return NULL;
                     85:                        }
                     86:                        break;
                     87:                case 1:
                     88:                        pub_rtlm = rtlm;
                     89:                        call.OpenPUB = mqttOpenRTLM;
                     90:                        call.ClosePUB = mqttCloseRTLM;
                     91:                        call.InitSessPUB = dlsym(rtlm, "mqtt_rtlm_init_session");
                     92:                        call.FiniSessPUB = dlsym(rtlm, "mqtt_rtlm_fini_session");
                     93:                        call.ChkSessPUB = dlsym(rtlm, "mqtt_rtlm_chk_session");
1.2.2.1   misho      94:                        call.WritePUB_topic = dlsym(rtlm, "mqtt_rtlm_write_topic");
                     95:                        call.ReadPUB_topic = dlsym(rtlm, "mqtt_rtlm_read_topic");
                     96:                        call.DeletePUB_topic = dlsym(rtlm, "mqtt_rtlm_delete_topic");
                     97:                        call.WritePUB_subscribe = dlsym(rtlm, "mqtt_rtlm_write_subscribe");
                     98:                        call.ReadPUB_subscribe = dlsym(rtlm, "mqtt_rtlm_read_subscribe");
                     99:                        call.DeletePUB_subscribe = dlsym(rtlm, "mqtt_rtlm_delete_subscribe");
1.2       misho     100:                        if (!call.InitSessPUB || !call.FiniSessPUB || !call.ChkSessPUB || 
1.2.2.1   misho     101:                                        !call.WritePUB_topic || !call.ReadPUB_topic || 
1.2.2.2   misho     102:                                        !call.DeletePUB_topic || !call.WritePUB_subscribe || 
                    103:                                        !call.ReadPUB_subscribe || !call.DeletePUB_subscribe) {
1.2       misho     104:                                mqttLog("Error:: incorrect module ...\n");
                    105:                                dlclose(rtlm);
                    106:                                return NULL;
                    107:                        }
                    108:                        break;
                    109:                default:
                    110:                        log_rtlm = rtlm;
                    111:                        call.OpenLOG = mqttOpenRTLM;
                    112:                        call.CloseLOG = mqttCloseRTLM;
                    113:                        call.LOG = dlsym(rtlm, "mqtt_rtlm_logger");
                    114:                        if (!call.LOG) {
                    115:                                mqttLog("Error:: incorrect module ...\n");
                    116:                                dlclose(rtlm);
                    117:                                return NULL;
                    118:                        }
                    119:                        break;
                    120:        }
                    121: 
                    122:        return rtlm;
                    123: }
                    124: 
                    125: void
                    126: mqttUnloadRTLM(int modtype)
                    127: {
                    128:        switch (modtype) {
                    129:                case 0:
                    130:                        dlclose(acc_rtlm);
                    131:                        break;
                    132:                case 1:
                    133:                        dlclose(pub_rtlm);
                    134:                        break;
                    135:                default:
                    136:                        dlclose(log_rtlm);
                    137:                        break;
                    138:        }
                    139: }
                    140: 
                    141: inline int
1.2.2.3   misho     142: mqttMkDir(cfg_root_t *cfg)
1.2       misho     143: {
                    144:        const char *str;
                    145: 
                    146:        if (!cfg)
                    147:                return -1;
                    148: 
1.2.2.3   misho     149:        str = (const char*) cfg_getAttribute(cfg, "mqttd", "statedir");
1.2       misho     150:        if (!str)
                    151:                return -1;
                    152: 
                    153:        if (mkdir(str, 0600) == -1 && errno != EEXIST)
                    154:                return -1;
                    155: 
                    156:        return 0;
                    157: }

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