|
version 1.1.1.1, 2011/11/07 08:47:16
|
version 1.1.1.1.2.4, 2011/11/18 10:11:37
|
|
Line 1
|
Line 1
|
| #include "global.h" |
#include "global.h" |
| |
|
| |
|
| static int mqtt_Errno; | #pragma GCC visibility push(hidden) |
| static char mqtt_Error[STRSIZ]; | |
| |
|
| |
int mqtt_Errno; |
| |
char mqtt_Error[STRSIZ]; |
| |
|
| |
#pragma GCC visibility pop |
| |
|
| // |
// |
| // Error maintenance functions ... |
// Error maintenance functions ... |
| // |
// |
|
Line 38 mqtt_SetErr(int eno, char *estr, ...)
|
Line 41 mqtt_SetErr(int eno, char *estr, ...)
|
| |
|
| // ---------------------------------------------------------- |
// ---------------------------------------------------------- |
| |
|
| |
/* |
| |
* mqtt_encodeLen() Encode number to MQTT length field |
| |
* @num = number for encode |
| |
* return: -1 error or >-1 length |
| |
*/ |
| |
inline u_int |
| |
mqtt_encodeLen(u_int num) |
| |
{ |
| |
register u_int dig, i; |
| |
u_int ret = 0; |
| |
|
| |
if (num > 268435455) |
| |
return (u_int) -1; |
| |
|
| |
for (i = 0; i < sizeof ret && num > 0; i++) { |
| |
dig = num % 0x80; |
| |
num /= 0x80; |
| |
if (num > 0) |
| |
dig |= 0x80; |
| |
|
| |
*((u_char*) &ret + i) = (u_char) dig; |
| |
} |
| |
|
| |
return ret; |
| |
} |
| |
|
| |
/* |
| |
* mqtt_decodeLen() Decode length from MQTT packet |
| |
* @len = length |
| |
* @n = sizeof bytes, if !=NULL |
| |
* return: -1 error, >-1 length of message |
| |
*/ |
| |
inline u_int |
| |
mqtt_decodeLen(u_int len, char *n) |
| |
{ |
| |
register u_int i, dig, mul; |
| |
u_int ret = 0; |
| |
u_char *p = (u_char*) &len; |
| |
|
| |
if (len > 0xffffff7f) |
| |
return (u_int) -1; |
| |
|
| |
for (mul = 1, i = 0; i < sizeof ret; i++, mul *= 0x80) { |
| |
dig = p[i]; |
| |
ret += (dig & 0x7f) * mul; |
| |
|
| |
if (!(dig & 0x80)) |
| |
break; |
| |
} |
| |
|
| |
if (n) |
| |
*n = (char) (i & 0x7f) + 1; |
| |
return ret; |
| |
} |
| |
|
| |
/* |
| |
* mqtt_sizeLen Return sizeof len field |
| |
* @len = length |
| |
* return: -1 error, >-1 sizeof len in bytes |
| |
*/ |
| |
inline char |
| |
mqtt_sizeLen(u_int len) |
| |
{ |
| |
register char i; |
| |
u_char *p = (u_char*) &len; |
| |
|
| |
if (len > 0xffffff7f) |
| |
return -1; |
| |
|
| |
for (i = 0; i < sizeof len; i++) |
| |
if (!(*(p + i) & 0x80)) |
| |
break; |
| |
|
| |
return ++i; |
| |
} |
| |
|
| |
/* |
| |
* mqtt_str2var Create MQTT variable from string |
| |
* @csStr = string |
| |
* @strLen = string length |
| |
* return: NULL error or != ok variable, must be free after use! |
| |
*/ |
| |
inline mqtthdr_var_t * |
| |
mqtt_str2var(const u_char *csStr, u_short strLen) |
| |
{ |
| |
mqtthdr_var_t *v; |
| |
|
| |
if (!csStr) |
| |
return NULL; |
| |
if (!(v = malloc(strLen + sizeof(mqtthdr_var_t)))) { |
| |
LOGERR; |
| |
return NULL; |
| |
} else |
| |
memset(v, 0, strLen + sizeof(mqtthdr_var_t)); |
| |
|
| |
memcpy(v->var_data, csStr, strLen); |
| |
v->var_sb.val = htons(strLen); |
| |
|
| |
return v; |
| |
} |