--- mqtt/src/Attic/conn.c 2011/12/09 09:53:54 1.1.2.10 +++ mqtt/src/Attic/conn.c 2011/12/09 11:46:48 1.1.2.12 @@ -253,16 +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 - * @psWillMessage = Will Message, may be NULL + * @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, 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; @@ -271,14 +272,14 @@ 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; @@ -287,14 +288,16 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short if (var->var_sb.sb.l != 6 || strncmp(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; @@ -310,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)); @@ -324,15 +327,15 @@ 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) { *psWillTopic = malloc(ntohs(var->var_sb.val) + 1); if (!*psWillTopic) { LOGERR; - flg.reserved = 1; - return flg; + 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)); @@ -344,15 +347,15 @@ 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) { *psWillMessage = malloc(ntohs(var->var_sb.val) + 1); if (!*psWillMessage) { LOGERR; - flg.reserved = 1; - return flg; + 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)); @@ -367,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--); @@ -383,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--); @@ -395,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; } /*