Annotation of mqtt/src/aitmqtt.c, revision 1.1.1.1.2.6

1.1       misho       1: #include "global.h"
                      2: 
                      3: 
1.1.1.1.2.4  misho       4: #pragma GCC visibility push(hidden)
1.1       misho       5: 
1.1.1.1.2.4  misho       6: int mqtt_Errno;
                      7: char mqtt_Error[STRSIZ];
                      8: 
                      9: #pragma GCC visibility pop
1.1       misho      10: 
                     11: //
                     12: // Error maintenance functions ...
                     13: //
                     14: 
                     15: // mqtt_GetErrno() Get error code of last operation
                     16: inline int
                     17: mqtt_GetErrno()
                     18: {
                     19:        return mqtt_Errno;
                     20: }
                     21: 
                     22: // mqtt_GetError() Get error text of last operation
                     23: inline const char *
                     24: mqtt_GetError()
                     25: {
                     26:        return mqtt_Error;
                     27: }
                     28: 
                     29: // mqtt_SetErr() Set error to variables for internal use!!!
                     30: inline void
                     31: mqtt_SetErr(int eno, char *estr, ...)
                     32: {
                     33:        va_list lst;
                     34: 
                     35:        mqtt_Errno = eno;
                     36:        memset(mqtt_Error, 0, sizeof mqtt_Error);
                     37:        va_start(lst, estr);
                     38:        vsnprintf(mqtt_Error, sizeof mqtt_Error, estr, lst);
                     39:        va_end(lst);
                     40: }
                     41: 
                     42: // ----------------------------------------------------------
                     43: 
1.1.1.1.2.1  misho      44: /*
1.1.1.1.2.5  misho      45:  * mqtt_msgFree() Free MQTT message
                     46:  * @msg = Message buffer
                     47:  * @all = !=0 Destroy entire message, if MQTT Message allocated with mqtt_msgAlloc()
                     48:  * return: none
                     49:  */
                     50: inline void
                     51: mqtt_msgFree(mqtt_msg_t ** __restrict msg, int all)
                     52: {
                     53:        if (msg && *msg) {
                     54:                if ((*msg)->msg_base) {
                     55:                        free((*msg)->msg_base);
                     56:                        (*msg)->msg_base = NULL;
                     57:                }
                     58:                if (all) {
                     59:                        free(*msg);
                     60:                        *msg = NULL;
                     61:                } else
                     62:                        (*msg)->msg_len ^= (*msg)->msg_len;
                     63:        }
                     64: }
                     65: 
                     66: /*
                     67:  * mqtt_msgAlloc() Allocate memory for MQTT Message
                     68:  * @len = >0 Allocate buffer with length
                     69:  * return: NULL error or Message, after use must call mqtt_msgFree() with all!=0
                     70:  */
                     71: inline mqtt_msg_t *
                     72: mqtt_msgAlloc(u_short len)
                     73: {
                     74:        mqtt_msg_t *m = NULL;
                     75: 
                     76:        m = malloc(sizeof(mqtt_msg_t));
                     77:        if (!m) {
                     78:                LOGERR;
                     79:                return NULL;
                     80:        } else
                     81:                memset(m, 0, sizeof(mqtt_msg_t));
                     82: 
                     83:        if (len) {
                     84:                m->msg_len = len;
                     85:                m->msg_base = malloc(m->msg_len);
                     86:                if (!m->msg_base) {
                     87:                        LOGERR;
                     88:                        free(m);
                     89:                        return NULL;
                     90:                } else
                     91:                        memset(m->msg_base, 0, m->msg_len);
                     92:        }
                     93: 
                     94:        return m;
                     95: }
                     96: 
                     97: /*
                     98:  * mqtt_msgRealloc() Reallocate MQTT message buffer
                     99:  * @msg = MQTT message
                    100:  * @len = new length
                    101:  * return: -1 error or >-1 old buffer length
                    102:  */
                    103: inline int
                    104: mqtt_msgRealloc(mqtt_msg_t * __restrict msg, u_short len)
                    105: {
                    106:        void *p = NULL;
                    107:        int ret = 0;
                    108: 
                    109:        if (!msg)
                    110:                return -1;
                    111: 
                    112:        if (len == msg->msg_len)
                    113:                return len;
                    114: 
                    115:        p = realloc(msg->msg_base, len);
                    116:        if (!p) {
                    117:                LOGERR;
                    118:                return -1;
                    119:        }
                    120: 
                    121:        ret = msg->msg_len;
                    122:        msg->msg_len = len;
                    123:        msg->msg_base = p;
                    124: 
                    125:        return ret;
                    126: }
                    127: 
                    128: /*
1.1.1.1.2.1  misho     129:  * mqtt_encodeLen() Encode number to MQTT length field
                    130:  * @num = number for encode
                    131:  * return: -1 error or >-1 length
                    132:  */
                    133: inline u_int
                    134: mqtt_encodeLen(u_int num)
                    135: {
                    136:        register u_int dig, i;
                    137:        u_int ret = 0;
                    138: 
                    139:        if (num > 268435455)
                    140:                return (u_int) -1;
                    141: 
                    142:        for (i = 0; i < sizeof ret && num > 0; i++) {
                    143:                dig = num % 0x80;
                    144:                num /= 0x80;
                    145:                if (num > 0)
                    146:                        dig |= 0x80;
                    147: 
                    148:                *((u_char*) &ret + i) = (u_char) dig;
                    149:        }
                    150: 
                    151:        return ret;
                    152: }
                    153: 
                    154: /*
                    155:  * mqtt_decodeLen() Decode length from MQTT packet
                    156:  * @len = length
1.1.1.1.2.2  misho     157:  * @n = sizeof bytes, if !=NULL
1.1.1.1.2.1  misho     158:  * return: -1 error, >-1 length of message
                    159:  */
                    160: inline u_int
1.1.1.1.2.2  misho     161: mqtt_decodeLen(u_int len, char *n)
1.1.1.1.2.1  misho     162: {
                    163:        register u_int i, dig, mul;
                    164:        u_int ret = 0;
                    165:        u_char *p = (u_char*) &len;
                    166: 
                    167:        if (len > 0xffffff7f)
                    168:                return (u_int) -1;
                    169: 
                    170:        for (mul = 1, i = 0; i < sizeof ret; i++, mul *= 0x80) {
                    171:                dig = p[i];
                    172:                ret += (dig & 0x7f) * mul;
                    173: 
                    174:                if (!(dig & 0x80))
                    175:                        break;
                    176:        }
                    177: 
1.1.1.1.2.2  misho     178:        if (n)
                    179:                *n = (char) (i & 0x7f) + 1;
1.1.1.1.2.1  misho     180:        return ret;
                    181: }
1.1.1.1.2.2  misho     182: 
                    183: /*
                    184:  * mqtt_sizeLen Return sizeof len field
                    185:  * @len = length
                    186:  * return: -1 error, >-1 sizeof len in bytes
                    187:  */
                    188: inline char
                    189: mqtt_sizeLen(u_int len)
                    190: {
                    191:        register char i;
                    192:        u_char *p = (u_char*) &len;
                    193: 
                    194:        if (len > 0xffffff7f)
                    195:                return -1;
                    196: 
                    197:        for (i = 0; i < sizeof len; i++)
                    198:                if (!(*(p + i) & 0x80))
                    199:                        break;
                    200: 
                    201:        return ++i;
                    202: }
1.1.1.1.2.3  misho     203: 
                    204: /*
1.1.1.1.2.6! misho     205:  * mqtt_str2sub Create MQTT subscribe variable from string(s)
        !           206:  * @csStr = strings
        !           207:  * @strnum = number of strings elements
        !           208:  * @qoses = QoS elements applied to subscribe variable, 
        !           209:  *             count of elements must be equal with csStr elements
        !           210:  * return: NULL error or != subscribe variables array, must be free after use with mqtt_freeSub()
1.1.1.1.2.3  misho     211:  */
1.1.1.1.2.6! misho     212: inline mqtt_subscr_t *
        !           213: mqtt_str2sub(const char **csStr, u_short strnum, u_char *qoses)
1.1.1.1.2.3  misho     214: {
1.1.1.1.2.6! misho     215:        mqtt_subscr_t *v;
        !           216:        register int i, items;
        !           217:        const char **strs;
1.1.1.1.2.3  misho     218: 
                    219:        if (!csStr)
                    220:                return NULL;
1.1.1.1.2.6! misho     221:        for (items = 0, strs = csStr; *strs; items++, strs++)
        !           222:                if (strnum && items >= strnum) {
        !           223:                        items = strnum;
        !           224:                        break;
        !           225:                }
        !           226: 
        !           227:        if (!(v = malloc((items + 1) * sizeof(mqtt_subscr_t)))) {
1.1.1.1.2.3  misho     228:                LOGERR;
                    229:                return NULL;
                    230:        } else
1.1.1.1.2.6! misho     231:                memset(v, 0, (items + 1) * sizeof(mqtt_subscr_t));
1.1.1.1.2.3  misho     232: 
1.1.1.1.2.6! misho     233:        for (i = 0; i < items; i++) {
        !           234:                v[i].sub_sb.val = htons(strlen(csStr[i]));
        !           235:                v[i].sub_data = strdup(csStr[i]);
        !           236:                if (qoses && qoses[i] < MQTT_QOS_RESERVED)
        !           237:                        v[i].sub_qos = qoses[i];
        !           238:        }
1.1.1.1.2.3  misho     239: 
                    240:        return v;
                    241: }
1.1.1.1.2.6! misho     242: 
        !           243: /*
        !           244:  * mqtt_freeSub() Free array from subscribe variables
        !           245:  *
        !           246:  * @subs = Subscribe variables
        !           247:  * return: none
        !           248:  */
        !           249: inline void
        !           250: mqtt_freeSub(mqtt_subscr_t ** __restrict subs)
        !           251: {
        !           252:        mqtt_subscr_t *v;
        !           253: 
        !           254:        if (!subs)
        !           255:                return;
        !           256: 
        !           257:        for (v = *subs; v; v++)
        !           258:                free(v->sub_data);
        !           259:        free(*subs);
        !           260:        *subs = NULL;
        !           261: }

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