--- mqtt/src/Attic/conn.c 2011/12/05 14:11:47 1.1.2.6 +++ mqtt/src/Attic/conn.c 2011/12/09 09:55:27 1.1.2.11 @@ -32,15 +32,15 @@ mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha if (!buf || !csConnID) return -1; - if (strlen(csConnID) > 23) { + if (strlen(csConnID) > 24) { mqtt_SetErr(EINVAL, "Error:: invalid argument ConnID is too long (max 23 bytes)"); return -1; } - if (csUser && strlen(csUser) > 12) { + if (csUser && strlen(csUser) > 13) { mqtt_SetErr(EINVAL, "Error:: invalid argument Username is too long (max 12 bytes)"); return -1; } - if (csPass && strlen(csPass) > 12) { + if (csPass && strlen(csPass) > 13) { mqtt_SetErr(EINVAL, "Error:: invalid argument Password is too long (max 12 bytes)"); return -1; } @@ -253,16 +253,14 @@ mqtt_msgDISCONNECT(mqtt_msg_t * __restrict buf) * @userLen = Username length * @psPass = Password for Username, only if csUser is set * @passLen = Password length - * @psWillTopic = Will Topic if !=NULL Will Flags set into message - * @topicLen = Will Topic length - * @psWillMessage = Will Message, may be NULL - * @msgLen = Will Message length + * @psWillTopic = Will Topic if !=NULL Will Flags set into message and must be free() + * @psWillMessage = Will Message, may be NULL if !NULL must be free() after use! * return: .reserved == 1 is error or == 0 connection flags & msg ok */ mqtthdr_connflgs_t 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 psWillTopic, int topicLen, char * __restrict psWillMessage, int msgLen) + char ** __restrict psWillTopic, char ** __restrict psWillMessage) { mqtthdr_connflgs_t flg = MQTT_CONNFLGS_INIT; struct mqtthdr *hdr; @@ -275,12 +273,9 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short if (!buf || !buf->msg_base || !buf->msg_len || !psConnID || !connLen) return flg; - hdr = (struct mqtthdr*) buf->msg_base; - if (hdr->mqtt_msg.type != MQTT_TYPE_CONNECT) { - mqtt_SetErr(EINVAL, "Error:: wrong command #%d", hdr->mqtt_msg.type); + hdr = _mqtt_readHEADER(buf, MQTT_TYPE_CONNECT, &ret, &len); + if (!hdr) return flg; - } else - len = mqtt_decodeLen(hdr->mqtt_len, &ret); if (len < 12) { mqtt_SetErr(EINVAL, "Error:: short message length %d", len); return flg; @@ -332,10 +327,15 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short flg.reserved = 1; return flg; } else { - if (psWillTopic && topicLen) { - memset(psWillTopic, 0, topicLen--); - memcpy(psWillTopic, var->var_data, - ntohs(var->var_sb.val) > topicLen ? topicLen : ntohs(var->var_sb.val)); + if (psWillTopic) { + *psWillTopic = malloc(ntohs(var->var_sb.val) + 1); + if (!*psWillTopic) { + LOGERR; + flg.reserved = 1; + return flg; + } else + memset(*psWillTopic, 0, ntohs(var->var_sb.val) + 1); + memcpy(*psWillTopic, var->var_data, ntohs(var->var_sb.val)); } pos += MQTTHDR_VAR_SIZEOF(var); } @@ -347,10 +347,15 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short flg.reserved = 1; return flg; } else { - if (psWillMessage && msgLen) { - memset(psWillMessage, 0, msgLen--); - memcpy(psWillMessage, var->var_data, - ntohs(var->var_sb.val) > msgLen ? msgLen : ntohs(var->var_sb.val)); + if (psWillMessage) { + *psWillMessage = malloc(ntohs(var->var_sb.val) + 1); + if (!*psWillMessage) { + LOGERR; + flg.reserved = 1; + return flg; + } else + memset(*psWillMessage, 0, ntohs(var->var_sb.val) + 1); + memcpy(*psWillMessage, var->var_data, ntohs(var->var_sb.val)); } pos += MQTTHDR_VAR_SIZEOF(var); } @@ -391,4 +396,97 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short } return flg; +} + +/* + * mqtt_readCONNACK() Read CONNACK message + * + * @buf = Message buffer + * return: -1 error or >-1 CONNECT message return code + */ +u_char +mqtt_readCONNACK(mqtt_msg_t * __restrict buf) +{ + int len, ret; + struct mqtthdr *hdr; + mqtthdr_connack_t *ack; + caddr_t pos; + + if (!buf || !buf->msg_base || !buf->msg_len) + return (u_char) -1; + + hdr = _mqtt_readHEADER(buf, MQTT_TYPE_CONNACK, &ret, &len); + if (!hdr) + return (u_char) -1; + if (len < sizeof(mqtthdr_connack_t)) { + mqtt_SetErr(EINVAL, "Error:: short message length %d", len); + return (u_char) -1; + } else { + pos = buf->msg_base + ret + 1; + ack = (mqtthdr_connack_t*) pos; + } + + if (ack->retcode > MQTT_RETCODE_DENIED) { + mqtt_SetErr(EINVAL, "Error:: invalid retcode %u", ack->retcode); + return (u_char) -1; + } + + return ack->retcode; +} + +/* + * mqtt_readDISCONNECT() Read DISCONNECT message + * + * @buf = Message buffer + * return: -1 error, 0 ok, >0 undefined result + */ +int +mqtt_readDISCONNECT(mqtt_msg_t * __restrict buf) +{ + int len, ret; + struct mqtthdr *hdr; + + hdr = _mqtt_readHEADER(buf, MQTT_TYPE_DISCONNECT, &ret, &len); + if (!hdr || ret != 1) + return -1; + + return len; +} + +/* + * mqtt_readPINGREQ() Read PINGREQ message + * + * @buf = Message buffer + * return: -1 error, 0 ok, >0 undefined result + */ +int +mqtt_readPINGREQ(mqtt_msg_t * __restrict buf) +{ + int len, ret; + struct mqtthdr *hdr; + + hdr = _mqtt_readHEADER(buf, MQTT_TYPE_PINGREQ, &ret, &len); + if (!hdr || ret != 1) + return -1; + + return len; +} + +/* + * mqtt_readPINGRESP() Read PINGRESP message + * + * @buf = Message buffer + * return: -1 error, 0 ok, >0 undefined result + */ +int +mqtt_readPINGRESP(mqtt_msg_t * __restrict buf) +{ + int len, ret; + struct mqtthdr *hdr; + + hdr = _mqtt_readHEADER(buf, MQTT_TYPE_PINGRESP, &ret, &len); + if (!hdr || ret != 1) + return -1; + + return len; }