--- mqtt/src/Attic/conn.c 2011/12/05 17:05:38 1.1.2.9 +++ mqtt/src/Attic/conn.c 2011/12/13 15:23:43 1.1.2.14 @@ -8,6 +8,7 @@ * * @buf = Message buffer * @csConnID = ConnectID + * @kasec = Keep alive timeout * @csUser = Username if !=NULL * @csPass = Password for Username, only if csUser is set * @csWillTopic = Will Topic if !=NULL Will Flags set into message @@ -19,7 +20,7 @@ */ int 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, u_char ClrSess, u_char WillQOS, u_char WillRetain) { @@ -32,15 +33,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; } @@ -77,14 +78,14 @@ mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha /* CONNECT header */ flags->clean_sess = ClrSess ? 1 : 0; - if (csUser) { + if (csUser && *csUser) { flags->username = 1; flags->password = csPass ? 1 : 0; } else { flags->username = 0; flags->password = 0; } - if (csWillTopic) { + if (csWillTopic && *csWillTopic) { flags->will_flg = 1; flags->will_qos = WillQOS; flags->will_retain = WillRetain ? 1 : 0; @@ -94,7 +95,7 @@ mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha flags->will_retain = 0; } - ka->sb.l = MQTT_KEEPALIVE; + ka->val = kasec ? htons(kasec) : htons(MQTT_KEEPALIVE); /* ConnID */ cid = (mqtthdr_var_t*) (buf->msg_base + siz); @@ -103,14 +104,14 @@ mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha memcpy(cid->var_data, csConnID, ntohs(cid->var_sb.val)); /* If Will Flags setup */ - if (csWillTopic) { + if (csWillTopic && *csWillTopic) { topic = (mqtthdr_var_t*) (buf->msg_base + siz); topic->var_sb.val = htons(strlen(csWillTopic)); memcpy(topic->var_data, csWillTopic, ntohs(topic->var_sb.val)); siz += MQTTHDR_VAR_SIZEOF(topic); wmsg = (mqtthdr_var_t*) (buf->msg_base + siz); - if (csWillMessage) { + if (csWillMessage && *csWillMessage) { wmsg->var_sb.val = htons(strlen(csWillMessage)); memcpy(wmsg->var_data, csWillMessage, ntohs(wmsg->var_sb.val)); } else @@ -119,13 +120,13 @@ mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha } /* If defined Username & Password */ - if (csUser) { + if (csUser && *csUser) { user = (mqtthdr_var_t*) (buf->msg_base + siz); user->var_sb.val = htons(strlen(csUser)); memcpy(user->var_data, csUser, ntohs(user->var_sb.val)); siz += MQTTHDR_VAR_SIZEOF(user); - if (csPass) { + if (csPass && *csPass) { pass = (mqtthdr_var_t*) (buf->msg_base + siz); pass->var_sb.val = htons(strlen(csPass)); memcpy(pass->var_data, csPass, ntohs(pass->var_sb.val)); @@ -253,18 +254,17 @@ 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 +mqtthdr_connack_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; + mqtthdr_connflgs_t flg = { MQTT_CONNFLGS_INIT }; + mqtthdr_connack_t cack = { 1, MQTT_RETCODE_DENIED }; struct mqtthdr *hdr; mqtthdr_var_t *var; mqtt_v_t *ka; @@ -273,30 +273,32 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short caddr_t pos; if (!buf || !buf->msg_base || !buf->msg_len || !psConnID || !connLen) - return flg; + return cack; hdr = _mqtt_readHEADER(buf, MQTT_TYPE_CONNECT, &ret, &len); if (!hdr) - return flg; + return cack; if (len < 12) { mqtt_SetErr(EINVAL, "Error:: short message length %d", len); - return flg; + return cack; } else { pos = buf->msg_base + ret + 1; var = (mqtthdr_var_t*) pos; } /* 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)", var->var_data, var->var_sb.sb.l); - return flg; + cack.retcode = MQTT_RETCODE_REFUSE_UNAVAIL; + return cack; } else { pos += var->var_sb.sb.l + sizeof(mqtt_v_t); proto = (mqtthdr_protover_t*) pos; } if (*proto != MQTT_PROTO_VER) { mqtt_SetErr(EINVAL, "Error:: invalid protocol version %d", *pos); - return flg; + cack.retcode = MQTT_RETCODE_REFUSE_VER; + return cack; } else pos++; flg = *(mqtthdr_connflgs_t*) pos; @@ -312,8 +314,8 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short len -= MQTTHDR_VAR_SIZEOF(var); if (len < 0) { mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Connection ID %d", len); - flg.reserved = 1; - return flg; + cack.retcode = MQTT_RETCODE_REFUSE_ID; + return cack; } else { memset(psConnID, 0, connLen--); memcpy(psConnID, var->var_data, ntohs(var->var_sb.val) > connLen ? connLen : ntohs(var->var_sb.val)); @@ -326,13 +328,18 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short len -= MQTTHDR_VAR_SIZEOF(var); if (len < 0) { mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Will Topic %d", len); - flg.reserved = 1; - return flg; + cack.retcode = MQTT_RETCODE_REFUSE_ID; + return cack; } 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; + cack.retcode = MQTT_RETCODE_REFUSE_UNAVAIL; + return cack; + } 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); } @@ -341,13 +348,18 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short len -= MQTTHDR_VAR_SIZEOF(var); if (len < 0) { mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Will Message %d", len); - flg.reserved = 1; - return flg; + cack.retcode = MQTT_RETCODE_REFUSE_ID; + return cack; } 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; + cack.retcode = MQTT_RETCODE_REFUSE_UNAVAIL; + return cack; + } 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); } @@ -359,8 +371,8 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short len -= MQTTHDR_VAR_SIZEOF(var); if (len < 0) { mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Username %d", len); - flg.reserved = 1; - return flg; + cack.retcode = MQTT_RETCODE_REFUSE_USERPASS; + return cack; } else { if (psUser && userLen) { memset(psUser, 0, userLen--); @@ -375,8 +387,8 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short len -= MQTTHDR_VAR_SIZEOF(var); if (len < 0) { mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Password %d", len); - flg.reserved = 1; - return flg; + cack.retcode = MQTT_RETCODE_REFUSE_USERPASS; + return cack; } else { if (psPass && passLen) { memset(psPass, 0, passLen--); @@ -387,7 +399,10 @@ 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; } /*