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>