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

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: /*
                    205:  * mqtt_str2var Create MQTT variable from string
                    206:  * @csStr = string
                    207:  * @strLen = string length
                    208:  * return: NULL error or != ok variable, must be free after use!
                    209:  */
                    210: inline mqtthdr_var_t *
                    211: mqtt_str2var(const u_char *csStr, u_short strLen)
                    212: {
                    213:        mqtthdr_var_t *v;
                    214: 
                    215:        if (!csStr)
                    216:                return NULL;
                    217:        if (!(v = malloc(strLen + sizeof(mqtthdr_var_t)))) {
                    218:                LOGERR;
                    219:                return NULL;
                    220:        } else
                    221:                memset(v, 0, strLen + sizeof(mqtthdr_var_t));
                    222: 
                    223:        memcpy(v->var_data, csStr, strLen);
                    224:        v->var_sb.val = htons(strLen);
                    225: 
                    226:        return v;
                    227: }

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