version 1.1.2.12, 2011/12/09 11:46:48
|
version 1.1.2.15, 2011/12/16 02:09:20
|
Line 8
|
Line 8
|
* |
* |
* @buf = Message buffer |
* @buf = Message buffer |
* @csConnID = ConnectID |
* @csConnID = ConnectID |
|
* @kasec = Keep alive timeout |
* @csUser = Username if !=NULL |
* @csUser = Username if !=NULL |
* @csPass = Password for Username, only if csUser is set |
* @csPass = Password for Username, only if csUser is set |
* @csWillTopic = Will Topic if !=NULL Will Flags set into message |
* @csWillTopic = Will Topic if !=NULL Will Flags set into message |
Line 19
|
Line 20
|
*/ |
*/ |
int |
int |
mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const char *csConnID, |
mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const char *csConnID, |
const char *csUser, const char *csPass, | u_short kasec, const char *csUser, const char *csPass, |
const char *csWillTopic, const char *csWillMessage, |
const char *csWillTopic, const char *csWillMessage, |
u_char ClrSess, u_char WillQOS, u_char WillRetain) |
u_char ClrSess, u_char WillQOS, u_char WillRetain) |
{ |
{ |
Line 32 mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
|
Line 33 mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
|
|
|
if (!buf || !csConnID) |
if (!buf || !csConnID) |
return -1; |
return -1; |
if (strlen(csConnID) > 24) { | if (strlen(csConnID) > 23) { |
mqtt_SetErr(EINVAL, "Error:: invalid argument ConnID is too long (max 23 bytes)"); |
mqtt_SetErr(EINVAL, "Error:: invalid argument ConnID is too long (max 23 bytes)"); |
return -1; |
return -1; |
} |
} |
if (csUser && strlen(csUser) > 13) { | if (csUser && strlen(csUser) > 12) { |
mqtt_SetErr(EINVAL, "Error:: invalid argument Username is too long (max 12 bytes)"); |
mqtt_SetErr(EINVAL, "Error:: invalid argument Username is too long (max 12 bytes)"); |
return -1; |
return -1; |
} |
} |
if (csPass && strlen(csPass) > 13) { | if (csPass && strlen(csPass) > 12) { |
mqtt_SetErr(EINVAL, "Error:: invalid argument Password is too long (max 12 bytes)"); |
mqtt_SetErr(EINVAL, "Error:: invalid argument Password is too long (max 12 bytes)"); |
return -1; |
return -1; |
} |
} |
Line 77 mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
|
Line 78 mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
|
|
|
/* CONNECT header */ |
/* CONNECT header */ |
flags->clean_sess = ClrSess ? 1 : 0; |
flags->clean_sess = ClrSess ? 1 : 0; |
if (csUser) { | if (csUser && *csUser) { |
flags->username = 1; |
flags->username = 1; |
flags->password = csPass ? 1 : 0; |
flags->password = csPass ? 1 : 0; |
} else { |
} else { |
flags->username = 0; |
flags->username = 0; |
flags->password = 0; |
flags->password = 0; |
} |
} |
if (csWillTopic) { | if (csWillTopic && *csWillTopic) { |
flags->will_flg = 1; |
flags->will_flg = 1; |
flags->will_qos = WillQOS; |
flags->will_qos = WillQOS; |
flags->will_retain = WillRetain ? 1 : 0; |
flags->will_retain = WillRetain ? 1 : 0; |
Line 94 mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
|
Line 95 mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
|
flags->will_retain = 0; |
flags->will_retain = 0; |
} |
} |
|
|
ka->sb.l = MQTT_KEEPALIVE; | ka->val = kasec ? htons(kasec) : htons(MQTT_KEEPALIVE); |
|
|
/* ConnID */ |
/* ConnID */ |
cid = (mqtthdr_var_t*) (buf->msg_base + siz); |
cid = (mqtthdr_var_t*) (buf->msg_base + siz); |
Line 103 mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
|
Line 104 mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
|
memcpy(cid->var_data, csConnID, ntohs(cid->var_sb.val)); |
memcpy(cid->var_data, csConnID, ntohs(cid->var_sb.val)); |
|
|
/* If Will Flags setup */ |
/* If Will Flags setup */ |
if (csWillTopic) { | if (csWillTopic && *csWillTopic) { |
topic = (mqtthdr_var_t*) (buf->msg_base + siz); |
topic = (mqtthdr_var_t*) (buf->msg_base + siz); |
topic->var_sb.val = htons(strlen(csWillTopic)); |
topic->var_sb.val = htons(strlen(csWillTopic)); |
memcpy(topic->var_data, csWillTopic, ntohs(topic->var_sb.val)); |
memcpy(topic->var_data, csWillTopic, ntohs(topic->var_sb.val)); |
siz += MQTTHDR_VAR_SIZEOF(topic); |
siz += MQTTHDR_VAR_SIZEOF(topic); |
|
|
wmsg = (mqtthdr_var_t*) (buf->msg_base + siz); |
wmsg = (mqtthdr_var_t*) (buf->msg_base + siz); |
if (csWillMessage) { | if (csWillMessage && *csWillMessage) { |
wmsg->var_sb.val = htons(strlen(csWillMessage)); |
wmsg->var_sb.val = htons(strlen(csWillMessage)); |
memcpy(wmsg->var_data, csWillMessage, ntohs(wmsg->var_sb.val)); |
memcpy(wmsg->var_data, csWillMessage, ntohs(wmsg->var_sb.val)); |
} else |
} else |
Line 119 mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
|
Line 120 mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
|
} |
} |
|
|
/* If defined Username & Password */ |
/* If defined Username & Password */ |
if (csUser) { | if (csUser && *csUser) { |
user = (mqtthdr_var_t*) (buf->msg_base + siz); |
user = (mqtthdr_var_t*) (buf->msg_base + siz); |
user->var_sb.val = htons(strlen(csUser)); |
user->var_sb.val = htons(strlen(csUser)); |
memcpy(user->var_data, csUser, ntohs(user->var_sb.val)); |
memcpy(user->var_data, csUser, ntohs(user->var_sb.val)); |
siz += MQTTHDR_VAR_SIZEOF(user); |
siz += MQTTHDR_VAR_SIZEOF(user); |
|
|
if (csPass) { | if (csPass && *csPass) { |
pass = (mqtthdr_var_t*) (buf->msg_base + siz); |
pass = (mqtthdr_var_t*) (buf->msg_base + siz); |
pass->var_sb.val = htons(strlen(csPass)); |
pass->var_sb.val = htons(strlen(csPass)); |
memcpy(pass->var_data, csPass, ntohs(pass->var_sb.val)); |
memcpy(pass->var_data, csPass, ntohs(pass->var_sb.val)); |
Line 285 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 286 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
var = (mqtthdr_var_t*) pos; |
var = (mqtthdr_var_t*) pos; |
} |
} |
/* check init string & protocol */ |
/* check init string & protocol */ |
if (var->var_sb.sb.l != 6 || strncmp(var->var_data, MQTT_CONN_STR, 6)) { | if (var->var_sb.sb.l != 6 || strncmp((char*) var->var_data, MQTT_CONN_STR, 6)) { |
mqtt_SetErr(EINVAL, "Error:: invalid init string %.6s(%d)", |
mqtt_SetErr(EINVAL, "Error:: invalid init string %.6s(%d)", |
var->var_data, var->var_sb.sb.l); |
var->var_data, var->var_sb.sb.l); |
cack.retcode = MQTT_RETCODE_REFUSE_UNAVAIL; |
cack.retcode = MQTT_RETCODE_REFUSE_UNAVAIL; |
Line 311 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 312 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
/* get ConnID */ |
/* get ConnID */ |
var = (mqtthdr_var_t*) pos; |
var = (mqtthdr_var_t*) pos; |
len -= MQTTHDR_VAR_SIZEOF(var); |
len -= MQTTHDR_VAR_SIZEOF(var); |
if (len < 0) { | if (len < 0 || var->var_sb.sb.l > 23) { |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Connection ID %d", len); |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Connection ID %d", len); |
cack.retcode = MQTT_RETCODE_REFUSE_ID; |
cack.retcode = MQTT_RETCODE_REFUSE_ID; |
return cack; |
return cack; |
Line 368 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 369 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
if (flg.username) { |
if (flg.username) { |
var = (mqtthdr_var_t*) pos; |
var = (mqtthdr_var_t*) pos; |
len -= MQTTHDR_VAR_SIZEOF(var); |
len -= MQTTHDR_VAR_SIZEOF(var); |
if (len < 0) { | if (len < 0 || var->var_sb.sb.l > 12) { |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Username %d", len); |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Username %d", len); |
cack.retcode = MQTT_RETCODE_REFUSE_USERPASS; |
cack.retcode = MQTT_RETCODE_REFUSE_USERPASS; |
return cack; |
return cack; |
Line 384 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 385 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
if (flg.password) { |
if (flg.password) { |
var = (mqtthdr_var_t*) pos; |
var = (mqtthdr_var_t*) pos; |
len -= MQTTHDR_VAR_SIZEOF(var); |
len -= MQTTHDR_VAR_SIZEOF(var); |
if (len < 0) { | if (len < 0 || var->var_sb.sb.l > 12) { |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Password %d", len); |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Password %d", len); |
cack.retcode = MQTT_RETCODE_REFUSE_USERPASS; |
cack.retcode = MQTT_RETCODE_REFUSE_USERPASS; |
return cack; |
return cack; |