Diff for /libaitmqtt/src/conn.c between versions 1.1.1.1.2.4 and 1.3.12.2

version 1.1.1.1.2.4, 2012/06/20 08:57:48 version 1.3.12.2, 2022/09/13 22:20:59
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012Copyright 2004 - 2022
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 49  SUCH DAMAGE. Line 49  SUCH DAMAGE.
 /*  /*
  * mqtt_msgCONNECT() Create CONNECT message   * mqtt_msgCONNECT() Create CONNECT message
  *   *
  * @buf = Message buffer  
  * @csConnID = ConnectID   * @csConnID = ConnectID
 * @kasec = Keep alive timeout, if =0 default timeout for MQTT * @Version = MQTT version
  * @KASec = Keep alive timeout, if =0 default timeout for MQTT
  * @csUser = Username if !=NULL   * @csUser = Username if !=NULL
  * @csPass = Password for Username, only if csUser is set   * @csPass = Password for Username, only if csUser is set
  * @csWillTopic = Will Topic if !=NULL Will Flags set into message   * @csWillTopic = Will Topic if !=NULL Will Flags set into message
Line 59  SUCH DAMAGE. Line 59  SUCH DAMAGE.
  * @ClrSess = Clear Session subscriptions after disconnect   * @ClrSess = Clear Session subscriptions after disconnect
  * @WillQOS = Will QOS if csWillTopic is set   * @WillQOS = Will QOS if csWillTopic is set
  * @WillRetain = Will Retain Will Message if csWillTopic is set   * @WillRetain = Will Retain Will Message if csWillTopic is set
 * return: -1 error or >-1 message size for send * return: NULL error or allocated connect message
  */   */
intmqtt_msg_t *
mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const char *csConnID, mqtt_msgCONNECT(const char *csConnID, u_char Version, u_short KASec, 
                u_short kasec, const char *csUser, const char *csPass,                 const char *csUser, const char *csPass, 
                 const char *csWillTopic, const char *csWillMessage,                   const char *csWillTopic, const char *csWillMessage, 
                 u_char ClrSess, u_char WillQOS, u_char WillRetain)                  u_char ClrSess, u_char WillQOS, u_char WillRetain)
 {  {
        int n, len, siz = 0;        int len, siz = 0;
         u_int n, *l;
         mqtt_msg_t *msg = NULL;
         struct mqtthdr *hdr;          struct mqtthdr *hdr;
         mqtthdr_var_t *var, *cid, *topic, *wmsg, *user, *pass;          mqtthdr_var_t *var, *cid, *topic, *wmsg, *user, *pass;
         mqtthdr_protover_t *proto;  
         mqtthdr_connflgs_t *flags;          mqtthdr_connflgs_t *flags;
         mqtt_len_t *ka;          mqtt_len_t *ka;
         void *data;          void *data;
   
        if (!buf || !csConnID)        if (!csConnID)
                return -1;                return NULL;
        else        if (strlen(csConnID) >= MQTT_CONNID_MAX) {
                data = buf->msg_base;                mqtt_SetErr(EINVAL, "Invalid argument ConnID is too long (max %d bytes)"
        if (strlen(csConnID) > 23) {                                MQTT_CONNID_MAX - 1);
                mqtt_SetErr(EINVAL, "Invalid argument ConnID is too long (max 23 bytes)");                return NULL;
                return -1; 
         }          }
        if (csUser && strlen(csUser) > 12) {        if (Version < MQTT_PROTO_VER_3 || Version > MQTT_PROTO_VER_5) {
                mqtt_SetErr(EINVAL, "Invalid argument Username is too long (max 12 bytes)");                mqtt_SetErr(EINVAL, "Unsupported version");
                return -1;                return NULL;
         }          }
        if (csPass && strlen(csPass) > 12) {        if (csUser && strlen(csUser) >= MQTT_CRED_MAX) {
                mqtt_SetErr(EINVAL, "Invalid argument Password is too long (max 12 bytes)");                mqtt_SetErr(EINVAL, "Invalid argument Username is too long (max %d bytes)"
                return -1;                                MQTT_CRED_MAX - 1);
                 return NULL;
         }          }
           if (csPass && strlen(csPass) >= MQTT_CRED_MAX) {
                   mqtt_SetErr(EINVAL, "Invalid argument Password is too long (max %d bytes)", 
                                   MQTT_CRED_MAX - 1);
                   return NULL;
           }
         if (WillQOS > MQTT_QOS_EXACTLY) {          if (WillQOS > MQTT_QOS_EXACTLY) {
                 mqtt_SetErr(EINVAL, "Invalid argument WillQOS - unknown QOS value");                  mqtt_SetErr(EINVAL, "Invalid argument WillQOS - unknown QOS value");
                return -1;                return NULL;
         }          }
   
         /* calculate message size */          /* calculate message size */
        len = 10 + sizeof(mqtt_len_t);                   /* connect arguments */        len = 10;        /* connect arguments: MQTT(6)+Version(1)+ConnFlags(1)+KeepAlive(2) */
         len += sizeof(mqtt_len_t) + strlen(csConnID);   /* connect id */          len += sizeof(mqtt_len_t) + strlen(csConnID);   /* connect id */
         if (csUser && *csUser) {                        /* user/pass */          if (csUser && *csUser) {                        /* user/pass */
                 len += sizeof(mqtt_len_t) + strlen(csUser);                  len += sizeof(mqtt_len_t) + strlen(csUser);
Line 106  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha Line 112  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
         }          }
         if (csWillTopic && *csWillTopic) {              /* will messages */          if (csWillTopic && *csWillTopic) {              /* will messages */
                 len += sizeof(mqtt_len_t) + strlen(csWillTopic);                  len += sizeof(mqtt_len_t) + strlen(csWillTopic);
                len += sizeof(mqtt_len_t) + csWillMessage ? strlen(csWillMessage) : 0;                len += sizeof(mqtt_len_t) + (csWillMessage ? strlen(csWillMessage) : 0);
         }          }
   
         /* calculate header size */          /* calculate header size */
Line 114  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha Line 120  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
         n = mqtt_encodeLen(len);                        /* message size */          n = mqtt_encodeLen(len);                        /* message size */
         siz += mqtt_sizeLen(n) - 1;                     /* length size */          siz += mqtt_sizeLen(n) - 1;                     /* length size */
   
        if (mqtt_msgRealloc(buf, siz + len) == -1)        if (!(msg = mqtt_msgAlloc(siz + len)))
                return -1;                return NULL;
        else        else {
                 data = msg->msg_base;
                 hdr = (struct mqtthdr *) data;                  hdr = (struct mqtthdr *) data;
           }
   
         /* fixed header */          /* fixed header */
         MQTTHDR_MSGINIT(hdr);  
         hdr->mqtt_msg.type = MQTT_TYPE_CONNECT;          hdr->mqtt_msg.type = MQTT_TYPE_CONNECT;
        *(u_int*) hdr->mqtt_len = n;        l = (u_int*) hdr->mqtt_len;
         *l = n;
         data += siz;          data += siz;
   
         /* variable header */          /* variable header */
         var = (mqtthdr_var_t*) data;          var = (mqtthdr_var_t*) data;
        var->var_sb.val = htons(strlen(MQTT_CONN_STR));        var->var_sb.val = htons(strlen(MQTT_PROTO_STR));
        memcpy(var->var_data, MQTT_CONN_STR, ntohs(var->var_sb.val));        memcpy(var->var_data, MQTT_PROTO_STR, ntohs(var->var_sb.val));
         data += MQTTHDR_VAR_SIZEOF(var);          data += MQTTHDR_VAR_SIZEOF(var);
   
         /* protocol version */          /* protocol version */
        proto = (mqtthdr_protover_t*) data++;        *(u_char*) data++ = Version;
        *proto = MQTT_PROTO_VER; 
   
         /* CONNECT header */          /* CONNECT header */
         flags = (mqtthdr_connflgs_t*) data++;          flags = (mqtthdr_connflgs_t*) data++;
Line 157  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha Line 164  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
   
         /* keep alive */          /* keep alive */
         ka = (mqtt_len_t*) data;          ka = (mqtt_len_t*) data;
        ka->val = kasec ? htons(kasec) : htons(MQTT_KEEPALIVE);        ka->val = KASec ? htons(KASec) : htons(MQTT_KEEPALIVE);
         data += sizeof(mqtt_len_t);          data += sizeof(mqtt_len_t);
   
         /* ConnID */          /* ConnID */
Line 197  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha Line 204  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
                 }                  }
         }          }
   
        return siz + len;        return msg;
 }  }
#if 0
 /*  /*
  * mqtt_msgCONNACK() Create CONNACK message   * mqtt_msgCONNACK() Create CONNACK message
  *   *
Line 207  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha Line 214  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
  * @retcode = Return code   * @retcode = Return code
  * return: -1 error or >-1 message size for send   * return: -1 error or >-1 message size for send
  */   */
intmqtt_msg_t *
mqtt_msgCONNACK(mqtt_msg_t * __restrict buf, u_char retcode)mqtt_msgCONNACK(u_char retcode)
 {  {
         int siz = 0;          int siz = 0;
         struct mqtthdr *hdr;          struct mqtthdr *hdr;
         mqtthdr_connack_t *ack;          mqtthdr_connack_t *ack;
           mqtt_msg_t *msg = NULL;
   
         if (!buf)  
                 return -1;  
         if (retcode > MQTT_RETCODE_DENIED) {          if (retcode > MQTT_RETCODE_DENIED) {
                 mqtt_SetErr(EINVAL, "Invalid retcode");                  mqtt_SetErr(EINVAL, "Invalid retcode");
                return -1;                return NULL;
         }          }
   
        if (mqtt_msgRealloc(buf, sizeof(struct mqtthdr) + sizeof(mqtthdr_connack_t)) == -1)        if (!(msg = mqtt_msgAlloc(sizeof(struct mqtthdr) + sizeof(mqtthdr_connack_t))))
                return -1;                return NULL;
         else {          else {
                 hdr = (struct mqtthdr *) (buf->msg_base + siz);                  hdr = (struct mqtthdr *) (buf->msg_base + siz);
                 siz += sizeof(struct mqtthdr);                  siz += sizeof(struct mqtthdr);
Line 329  mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short  Line 335  mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short 
         struct mqtthdr *hdr;          struct mqtthdr *hdr;
         mqtthdr_var_t *var;          mqtthdr_var_t *var;
         mqtt_len_t *ka;          mqtt_len_t *ka;
         mqtthdr_protover_t *proto;  
         int len, ret;          int len, ret;
         caddr_t pos;          caddr_t pos;
   
Line 558  mqtt_readPINGRESP(mqtt_msg_t * __restrict buf) Line 563  mqtt_readPINGRESP(mqtt_msg_t * __restrict buf)
   
         return len;          return len;
 }  }
   #endif

Removed from v.1.1.1.1.2.4  
changed lines
  Added in v.1.3.12.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>