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>