--- mqtt/src/Attic/conn.c 2011/12/05 17:05:38 1.1.2.9 +++ mqtt/src/Attic/conn.c 2011/12/13 10:12:36 1.1.2.13 @@ -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,18 +253,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 +272,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 +313,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 +327,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 +347,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 +370,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 +386,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 +398,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; } /*