--- mqtt/src/Attic/conn.c 2011/12/05 14:11:47 1.1.2.6 +++ mqtt/src/Attic/conn.c 2011/12/05 15:30:49 1.1.2.7 @@ -392,3 +392,42 @@ 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 = (struct mqtthdr*) buf->msg_base; + if (hdr->mqtt_msg.type != MQTT_TYPE_CONNACK) { + mqtt_SetErr(EINVAL, "Error:: wrong command #%d", hdr->mqtt_msg.type); + return (u_char) -1; + } else + len = mqtt_decodeLen(hdr->mqtt_len, &ret); + 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; +}