version 1.1.2.11, 2011/12/09 09:55:27
|
version 1.1.2.12, 2011/12/09 11:46:48
|
Line 257 mqtt_msgDISCONNECT(mqtt_msg_t * __restrict buf)
|
Line 257 mqtt_msgDISCONNECT(mqtt_msg_t * __restrict buf)
|
* @psWillMessage = Will Message, may be NULL if !NULL must be free() after use! |
* @psWillMessage = Will Message, may be NULL if !NULL must be free() after use! |
* return: .reserved == 1 is error or == 0 connection flags & msg ok |
* return: .reserved == 1 is error or == 0 connection flags & msg ok |
*/ |
*/ |
mqtthdr_connflgs_t | mqtthdr_connack_t |
mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short *kasec, char * __restrict psConnID, int connLen, |
mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short *kasec, char * __restrict psConnID, int connLen, |
char * __restrict psUser, int userLen, char * __restrict psPass, int passLen, |
char * __restrict psUser, int userLen, char * __restrict psPass, int passLen, |
char ** __restrict psWillTopic, char ** __restrict psWillMessage) |
char ** __restrict psWillTopic, char ** __restrict psWillMessage) |
{ |
{ |
mqtthdr_connflgs_t flg = MQTT_CONNFLGS_INIT; | mqtthdr_connflgs_t flg = { MQTT_CONNFLGS_INIT }; |
| mqtthdr_connack_t cack = { 1, MQTT_RETCODE_DENIED }; |
struct mqtthdr *hdr; |
struct mqtthdr *hdr; |
mqtthdr_var_t *var; |
mqtthdr_var_t *var; |
mqtt_v_t *ka; |
mqtt_v_t *ka; |
Line 271 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 272 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
caddr_t pos; |
caddr_t pos; |
|
|
if (!buf || !buf->msg_base || !buf->msg_len || !psConnID || !connLen) |
if (!buf || !buf->msg_base || !buf->msg_len || !psConnID || !connLen) |
return flg; | return cack; |
|
|
hdr = _mqtt_readHEADER(buf, MQTT_TYPE_CONNECT, &ret, &len); |
hdr = _mqtt_readHEADER(buf, MQTT_TYPE_CONNECT, &ret, &len); |
if (!hdr) |
if (!hdr) |
return flg; | return cack; |
if (len < 12) { |
if (len < 12) { |
mqtt_SetErr(EINVAL, "Error:: short message length %d", len); |
mqtt_SetErr(EINVAL, "Error:: short message length %d", len); |
return flg; | return cack; |
} else { |
} else { |
pos = buf->msg_base + ret + 1; |
pos = buf->msg_base + ret + 1; |
var = (mqtthdr_var_t*) pos; |
var = (mqtthdr_var_t*) pos; |
Line 287 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 288 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
if (var->var_sb.sb.l != 6 || strncmp(var->var_data, MQTT_CONN_STR, 6)) { |
if (var->var_sb.sb.l != 6 || strncmp(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); |
return flg; | cack.retcode = MQTT_RETCODE_REFUSE_UNAVAIL; |
| return cack; |
} else { |
} else { |
pos += var->var_sb.sb.l + sizeof(mqtt_v_t); |
pos += var->var_sb.sb.l + sizeof(mqtt_v_t); |
proto = (mqtthdr_protover_t*) pos; |
proto = (mqtthdr_protover_t*) pos; |
} |
} |
if (*proto != MQTT_PROTO_VER) { |
if (*proto != MQTT_PROTO_VER) { |
mqtt_SetErr(EINVAL, "Error:: invalid protocol version %d", *pos); |
mqtt_SetErr(EINVAL, "Error:: invalid protocol version %d", *pos); |
return flg; | cack.retcode = MQTT_RETCODE_REFUSE_VER; |
| return cack; |
} else |
} else |
pos++; |
pos++; |
flg = *(mqtthdr_connflgs_t*) pos; |
flg = *(mqtthdr_connflgs_t*) pos; |
Line 310 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 313 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
len -= MQTTHDR_VAR_SIZEOF(var); |
len -= MQTTHDR_VAR_SIZEOF(var); |
if (len < 0) { |
if (len < 0) { |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Connection ID %d", len); |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Connection ID %d", len); |
flg.reserved = 1; | cack.retcode = MQTT_RETCODE_REFUSE_ID; |
return flg; | return cack; |
} else { |
} else { |
memset(psConnID, 0, connLen--); |
memset(psConnID, 0, connLen--); |
memcpy(psConnID, var->var_data, ntohs(var->var_sb.val) > connLen ? connLen : ntohs(var->var_sb.val)); |
memcpy(psConnID, var->var_data, ntohs(var->var_sb.val) > connLen ? connLen : ntohs(var->var_sb.val)); |
Line 324 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 327 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
len -= MQTTHDR_VAR_SIZEOF(var); |
len -= MQTTHDR_VAR_SIZEOF(var); |
if (len < 0) { |
if (len < 0) { |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Will Topic %d", len); |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Will Topic %d", len); |
flg.reserved = 1; | cack.retcode = MQTT_RETCODE_REFUSE_ID; |
return flg; | return cack; |
} else { |
} else { |
if (psWillTopic) { |
if (psWillTopic) { |
*psWillTopic = malloc(ntohs(var->var_sb.val) + 1); |
*psWillTopic = malloc(ntohs(var->var_sb.val) + 1); |
if (!*psWillTopic) { |
if (!*psWillTopic) { |
LOGERR; |
LOGERR; |
flg.reserved = 1; | cack.retcode = MQTT_RETCODE_REFUSE_UNAVAIL; |
return flg; | return cack; |
} else |
} else |
memset(*psWillTopic, 0, ntohs(var->var_sb.val) + 1); |
memset(*psWillTopic, 0, ntohs(var->var_sb.val) + 1); |
memcpy(*psWillTopic, var->var_data, ntohs(var->var_sb.val)); |
memcpy(*psWillTopic, var->var_data, ntohs(var->var_sb.val)); |
Line 344 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 347 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
len -= MQTTHDR_VAR_SIZEOF(var); |
len -= MQTTHDR_VAR_SIZEOF(var); |
if (len < 0) { |
if (len < 0) { |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Will Message %d", len); |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Will Message %d", len); |
flg.reserved = 1; | cack.retcode = MQTT_RETCODE_REFUSE_ID; |
return flg; | return cack; |
} else { |
} else { |
if (psWillMessage) { |
if (psWillMessage) { |
*psWillMessage = malloc(ntohs(var->var_sb.val) + 1); |
*psWillMessage = malloc(ntohs(var->var_sb.val) + 1); |
if (!*psWillMessage) { |
if (!*psWillMessage) { |
LOGERR; |
LOGERR; |
flg.reserved = 1; | cack.retcode = MQTT_RETCODE_REFUSE_UNAVAIL; |
return flg; | return cack; |
} else |
} else |
memset(*psWillMessage, 0, ntohs(var->var_sb.val) + 1); |
memset(*psWillMessage, 0, ntohs(var->var_sb.val) + 1); |
memcpy(*psWillMessage, var->var_data, ntohs(var->var_sb.val)); |
memcpy(*psWillMessage, var->var_data, ntohs(var->var_sb.val)); |
Line 367 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 370 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
len -= MQTTHDR_VAR_SIZEOF(var); |
len -= MQTTHDR_VAR_SIZEOF(var); |
if (len < 0) { |
if (len < 0) { |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Username %d", len); |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Username %d", len); |
flg.reserved = 1; | cack.retcode = MQTT_RETCODE_REFUSE_USERPASS; |
return flg; | return cack; |
} else { |
} else { |
if (psUser && userLen) { |
if (psUser && userLen) { |
memset(psUser, 0, userLen--); |
memset(psUser, 0, userLen--); |
Line 383 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 386 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
len -= MQTTHDR_VAR_SIZEOF(var); |
len -= MQTTHDR_VAR_SIZEOF(var); |
if (len < 0) { |
if (len < 0) { |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Password %d", len); |
mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Password %d", len); |
flg.reserved = 1; | cack.retcode = MQTT_RETCODE_REFUSE_USERPASS; |
return flg; | return cack; |
} else { |
} else { |
if (psPass && passLen) { |
if (psPass && passLen) { |
memset(psPass, 0, passLen--); |
memset(psPass, 0, passLen--); |
Line 395 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
Line 398 mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short
|
} |
} |
} |
} |
|
|
return flg; | flg.reserved = 0; |
| cack.reserved = flg.flags; |
| cack.retcode = MQTT_RETCODE_ACCEPTED; |
| return cack; |
} |
} |
|
|
/* |
/* |