Diff for /libaitmqtt/src/cliside.c between versions 1.3 and 1.3.12.4

version 1.3, 2012/06/28 11:06:17 version 1.3.12.4, 2022/09/16 04:18:17
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 61  mqtt_cli_Open(struct sockaddr *addr, u_short timeout) Line 61  mqtt_cli_Open(struct sockaddr *addr, u_short timeout)
         if (!addr)          if (!addr)
                 return NULL;                  return NULL;
   
        cli = malloc(sizeof(mqtt_cli_t));        cli = e_malloc(sizeof(mqtt_cli_t));
         if (!cli) {          if (!cli) {
                 LOGERR;                  LOGERR;
                 return NULL;                  return NULL;
Line 72  mqtt_cli_Open(struct sockaddr *addr, u_short timeout) Line 72  mqtt_cli_Open(struct sockaddr *addr, u_short timeout)
         cli->sock = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);          cli->sock = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
         if (cli->sock == -1) {          if (cli->sock == -1) {
                 LOGERR;                  LOGERR;
                free(cli);                e_free(cli);
                 return NULL;                  return NULL;
         }          }
   #ifndef __linux__
         if (connect(cli->sock, addr, addr->sa_len) == -1) {          if (connect(cli->sock, addr, addr->sa_len) == -1) {
   #else
           if (connect(cli->sock, addr, addr->sa_family == AF_INET6 ? 
                                   sizeof(struct sockaddr_in6) : 
                                   sizeof(struct sockaddr_in)) == -1) {
   #endif
                 LOGERR;                  LOGERR;
                 close(cli->sock);                  close(cli->sock);
                free(cli);                e_free(cli);
                 return NULL;                  return NULL;
         }          }
   
         cli->buf = mqtt_msgAlloc(USHRT_MAX);  
         if (!cli->buf) {  
                 close(cli->sock);  
                 free(cli);  
                 return NULL;  
         }  
   
         return cli;          return cli;
 }  }
   
Line 101  mqtt_cli_Open(struct sockaddr *addr, u_short timeout) Line 100  mqtt_cli_Open(struct sockaddr *addr, u_short timeout)
 int  int
 mqtt_cli_Close(mqtt_cli_t ** __restrict cli)  mqtt_cli_Close(mqtt_cli_t ** __restrict cli)
 {  {
        int siz = 0;        int siz;
   
         if (!cli || !*cli)          if (!cli || !*cli)
                 return -1;                  return -1;
   
         /* send disconnect */          /* send disconnect */
        siz = mqtt_msgDISCONNECT((*cli)->buf);        (*cli)->buf = mqtt_msgDISCONNECT();
        if (siz > -1) {        if ((*cli)->buf) {
                siz = send((*cli)->sock, (*cli)->buf->msg_base, siz, MSG_NOSIGNAL);                siz = send((*cli)->sock, (*cli)->buf->msg_base, (*cli)->buf->msg_len, MSG_NOSIGNAL);
                 if (siz > -1)                  if (siz > -1)
                         shutdown((*cli)->sock, SHUT_RDWR);                          shutdown((*cli)->sock, SHUT_RDWR);
         }          }
         close((*cli)->sock);          close((*cli)->sock);
   
        mqtt_msgFree(&(*cli)->buf, 42);        mqtt_msgFree(&(*cli)->buf, 0);
   
        free(*cli);        e_free(*cli);
         *cli = NULL;          *cli = NULL;
         return 0;          return 0;
 }  }
Line 128  mqtt_cli_Close(mqtt_cli_t ** __restrict cli) Line 127  mqtt_cli_Close(mqtt_cli_t ** __restrict cli)
  * @cli = connected client   * @cli = connected client
  * @Topics = Topics for subscribes   * @Topics = Topics for subscribes
  * @msgID = Message ID   * @msgID = Message ID
  * @Dup = Duplicated request  
  * @QoS = Message QoS  
  * return: NULL error or !=NULL allocated array with subscribed QoS responses,    * return: NULL error or !=NULL allocated array with subscribed QoS responses, 
 *      must be free() result! *      must be e_free() result!
  */   */
 u_char *  u_char *
mqtt_cli_Subscribe(mqtt_cli_t * __restrict cli, mqtt_subscr_t * __restrict Topics, mqtt_cli_Subscribe(mqtt_cli_t * __restrict cli, mqtt_subscr_t * __restrict Topics, u_short msgID)
                u_short msgID, u_char Dup, u_char QoS) 
 {  {
         int siz = 0;          int siz = 0;
         u_short mid = 0;          u_short mid = 0;
Line 145  mqtt_cli_Subscribe(mqtt_cli_t * __restrict cli, mqtt_s Line 141  mqtt_cli_Subscribe(mqtt_cli_t * __restrict cli, mqtt_s
                 return NULL;                  return NULL;
   
         /* send subscribe */          /* send subscribe */
        siz = mqtt_msgSUBSCRIBE(cli->buf, Topics, msgID, Dup, QoS);        cli->buf = mqtt_msgSUBSCRIBE(Topics, msgID);
        if (siz == -1)        if (!cli->buf)
                 return NULL;                  return NULL;
        siz = send(cli->sock, cli->buf->msg_base, siz, MSG_NOSIGNAL);        siz = send(cli->sock, cli->buf->msg_base, cli->buf->msg_len, MSG_NOSIGNAL);
         if (siz == -1) {          if (siz == -1) {
                 LOGERR;                  LOGERR;
                 return NULL;                  return NULL;
         } else          } else
                memset(cli->buf->msg_base, 0, cli->buf->msg_len);                mqtt_msgFree(&cli->buf, 0);
   
         if ((siz = mqtt_wait4data(cli->sock, cli->timeout, POLLIN | POLLPRI)) == -1) {          if ((siz = mqtt_wait4data(cli->sock, cli->timeout, POLLIN | POLLPRI)) == -1) {
                 return NULL;                  return NULL;
Line 161  mqtt_cli_Subscribe(mqtt_cli_t * __restrict cli, mqtt_s Line 157  mqtt_cli_Subscribe(mqtt_cli_t * __restrict cli, mqtt_s
                 return NULL;                  return NULL;
   
         /* receive suback */          /* receive suback */
           cli->buf = mqtt_msgAlloc(BUFSIZ);
           if (!cli->buf)
                   return NULL;
         siz = recv(cli->sock, cli->buf->msg_base, cli->buf->msg_len, 0);          siz = recv(cli->sock, cli->buf->msg_base, cli->buf->msg_len, 0);
         if (siz == -1) {          if (siz == -1) {
                 LOGERR;                  LOGERR;
                   mqtt_msgFree(&cli->buf, 0);
                 return NULL;                  return NULL;
         }          }
         siz = mqtt_readSUBACK(cli->buf, &mid, &qoses);          siz = mqtt_readSUBACK(cli->buf, &mid, &qoses);
        if (siz == -1)        if (siz == -1) {
                 mqtt_msgFree(&cli->buf, 0);
                 return NULL;                  return NULL;
           }
         if (msgID != mid) {          if (msgID != mid) {
                free(qoses);                if (qoses)
                         e_free(qoses);
                 mqtt_msgFree(&cli->buf, 0);
                 mqtt_SetErr(ECANCELED, "Receive different message ID %hu != %hu", msgID, mid);                  mqtt_SetErr(ECANCELED, "Receive different message ID %hu != %hu", msgID, mid);
                 return NULL;                  return NULL;
         }          }
   
           mqtt_msgFree(&cli->buf, 0);
         return qoses;          return qoses;
 }  }
   
Line 198  mqtt_cli_Unsubscribe(mqtt_cli_t * __restrict cli, mqtt Line 203  mqtt_cli_Unsubscribe(mqtt_cli_t * __restrict cli, mqtt
                 return -1;                  return -1;
   
         /* send unsubscribe */          /* send unsubscribe */
        siz = mqtt_msgUNSUBSCRIBE(cli->buf, Topics, msgID, Dup, QoS);        cli->buf = mqtt_msgUNSUBSCRIBE(Topics, msgID, Dup, QoS);
        if (siz == -1)        if (!cli->buf)
                 return -1;                  return -1;
        siz = send(cli->sock, cli->buf->msg_base, siz, MSG_NOSIGNAL);        siz = send(cli->sock, cli->buf->msg_base, cli->buf->msg_len, MSG_NOSIGNAL);
         if (siz == -1) {          if (siz == -1) {
                 LOGERR;                  LOGERR;
                   mqtt_msgFree(&cli->buf, 0);
                 return -1;                  return -1;
         } else          } else
                memset(cli->buf->msg_base, 0, cli->buf->msg_len);                mqtt_msgFree(&cli->buf, 0);
   
         if ((siz = mqtt_wait4data(cli->sock, cli->timeout, POLLIN | POLLPRI)) == -1) {          if ((siz = mqtt_wait4data(cli->sock, cli->timeout, POLLIN | POLLPRI)) == -1) {
                 return -1;                  return -1;
Line 214  mqtt_cli_Unsubscribe(mqtt_cli_t * __restrict cli, mqtt Line 220  mqtt_cli_Unsubscribe(mqtt_cli_t * __restrict cli, mqtt
                 return -1;                  return -1;
   
         /* receive unsuback */          /* receive unsuback */
           cli->buf = mqtt_msgAlloc(BUFSIZ);
           if (!cli->buf)
                   return -1;
         siz = recv(cli->sock, cli->buf->msg_base, cli->buf->msg_len, 0);          siz = recv(cli->sock, cli->buf->msg_base, cli->buf->msg_len, 0);
         if (siz == -1) {          if (siz == -1) {
                 LOGERR;                  LOGERR;
                   mqtt_msgFree(&cli->buf, 0);
                 return -1;                  return -1;
         }          }
         siz = mqtt_readUNSUBACK(cli->buf);          siz = mqtt_readUNSUBACK(cli->buf);
        if (siz == -1)        if (siz == -1) {
                 mqtt_msgFree(&cli->buf, 0);
                 return -1;                  return -1;
           }
         if (msgID != siz) {          if (msgID != siz) {
                   mqtt_msgFree(&cli->buf, 0);
                 mqtt_SetErr(ECANCELED, "Receive different message ID %hu != %hu", msgID, siz);                  mqtt_SetErr(ECANCELED, "Receive different message ID %hu != %hu", msgID, siz);
                 return -1;                  return -1;
         }          }
   
           mqtt_msgFree(&cli->buf, 0);
         return 0;          return 0;
 }  }
   
Line 253  mqtt_cli_Publish(mqtt_cli_t * __restrict cli, u_short  Line 267  mqtt_cli_Publish(mqtt_cli_t * __restrict cli, u_short 
                 return -1;                  return -1;
   
         /* send publish */          /* send publish */
        siz = mqtt_msgPUBLISH(cli->buf, csTopic, msgID, Dup, QoS, Retain, pData, datLen);        cli->buf = mqtt_msgPUBLISH(csTopic, msgID, Dup, QoS, Retain, pData, datLen);
        if (siz == -1)        if (!cli->buf)
                 return -1;                  return -1;
        siz = send(cli->sock, cli->buf->msg_base, siz, MSG_NOSIGNAL);        wlen = send(cli->sock, cli->buf->msg_base, cli->buf->msg_len, MSG_NOSIGNAL);
        if (siz == -1) {        if (wlen == -1) {
                 LOGERR;                  LOGERR;
                   mqtt_msgFree(&cli->buf, 0);
                 return -1;                  return -1;
        } else {        } else
                wlen = siz;                mqtt_msgFree(&cli->buf, 0);
                memset(cli->buf->msg_base, 0, cli->buf->msg_len); 
        } 
   
         if (QoS == MQTT_QOS_ONCE)       /* no reply */          if (QoS == MQTT_QOS_ONCE)       /* no reply */
                 goto end;                  goto end;
Line 274  mqtt_cli_Publish(mqtt_cli_t * __restrict cli, u_short  Line 287  mqtt_cli_Publish(mqtt_cli_t * __restrict cli, u_short 
                 return -1;                  return -1;
   
         /* receive PUBxxx */          /* receive PUBxxx */
           cli->buf = mqtt_msgAlloc(BUFSIZ);
           if (!cli->buf)
                   return -1;
         siz = recv(cli->sock, cli->buf->msg_base, cli->buf->msg_len, 0);          siz = recv(cli->sock, cli->buf->msg_base, cli->buf->msg_len, 0);
         if (siz == -1) {          if (siz == -1) {
                 LOGERR;                  LOGERR;
                   mqtt_msgFree(&cli->buf, 0);
                 return -1;                  return -1;
         }          }
   
         if (QoS == MQTT_QOS_ACK) {      /* reply with PUBACK */          if (QoS == MQTT_QOS_ACK) {      /* reply with PUBACK */
                 siz = mqtt_readPUBACK(cli->buf);                  siz = mqtt_readPUBACK(cli->buf);
                if (siz == -1)                if (siz == -1) {
                         mqtt_msgFree(&cli->buf, 0);
                         return -1;                          return -1;
                   }
                 if (msgID != siz) {                  if (msgID != siz) {
                           mqtt_msgFree(&cli->buf, 0);
                         mqtt_SetErr(ECANCELED, "Receive different message ID %hu != %hu", msgID, siz);                          mqtt_SetErr(ECANCELED, "Receive different message ID %hu != %hu", msgID, siz);
                         return -1;                          return -1;
                 }                  }
                   mqtt_msgFree(&cli->buf, 0);
                 goto end;                  goto end;
         } else {                        /* reply with PUBREC */          } else {                        /* reply with PUBREC */
                 siz = mqtt_readPUBREC(cli->buf);                  siz = mqtt_readPUBREC(cli->buf);
                if (siz == -1)                if (siz == -1) {
                         mqtt_msgFree(&cli->buf, 0);
                         return -1;                          return -1;
                   }
                 if (msgID != siz) {                  if (msgID != siz) {
                           mqtt_msgFree(&cli->buf, 0);
                         mqtt_SetErr(ECANCELED, "Receive different message ID %hu != %hu", msgID, siz);                          mqtt_SetErr(ECANCELED, "Receive different message ID %hu != %hu", msgID, siz);
                         return -1;                          return -1;
                 }                  }
                   mqtt_msgFree(&cli->buf, 0);
         }          }
   
         do {          do {
                 /* send publish release QoS == 2 */                  /* send publish release QoS == 2 */
                siz = mqtt_msgPUBREL(cli->buf, msgID);                cli->buf = mqtt_msgPUBREL(msgID);
                if (siz == -1)                if (!cli->buf)
                         return -1;                          return -1;
                siz = send(cli->sock, cli->buf->msg_base, siz, MSG_NOSIGNAL);                siz = send(cli->sock, cli->buf->msg_base, cli->buf->msg_len, MSG_NOSIGNAL);
                 if (siz == -1) {                  if (siz == -1) {
                         LOGERR;                          LOGERR;
                           mqtt_msgFree(&cli->buf, 0);
                         return -1;                          return -1;
                 } else                  } else
                        memset(cli->buf->msg_base, 0, cli->buf->msg_len);                        mqtt_msgFree(&cli->buf, 0);
   
                 if ((siz = mqtt_wait4data(cli->sock, cli->timeout, POLLIN | POLLPRI)) == -1) {                  if ((siz = mqtt_wait4data(cli->sock, cli->timeout, POLLIN | POLLPRI)) == -1) {
                         return -1;                          return -1;
Line 321  mqtt_cli_Publish(mqtt_cli_t * __restrict cli, u_short  Line 347  mqtt_cli_Publish(mqtt_cli_t * __restrict cli, u_short 
                 }                  }
   
                 /* receive PUBCOMP */                  /* receive PUBCOMP */
                   cli->buf = mqtt_msgAlloc(BUFSIZ);
                   if (!cli->buf)
                           return -1;
                 siz = recv(cli->sock, cli->buf->msg_base, cli->buf->msg_len, 0);                  siz = recv(cli->sock, cli->buf->msg_base, cli->buf->msg_len, 0);
                 if (siz == -1) {                  if (siz == -1) {
                         LOGERR;                          LOGERR;
                           mqtt_msgFree(&cli->buf, 0);
                         return -1;                          return -1;
                 }                  }
   
                 siz = mqtt_readPUBCOMP(cli->buf);                  siz = mqtt_readPUBCOMP(cli->buf);
                if (siz == -1)                if (siz == -1) {
                         mqtt_msgFree(&cli->buf, 0);
                         return -1;                          return -1;
                   }
                 if (msgID != siz) {                  if (msgID != siz) {
                           mqtt_msgFree(&cli->buf, 0);
                         mqtt_SetErr(ECANCELED, "Receive different message ID %hu != %hu", msgID, siz);                          mqtt_SetErr(ECANCELED, "Receive different message ID %hu != %hu", msgID, siz);
                         if (Dup++ > 1)                          if (Dup++ > 1)
                                 return -1;                                  return -1;
                         else                          else
                                 continue;                                  continue;
                 }                  }
                   mqtt_msgFree(&cli->buf, 0);
         } while (0);          } while (0);
   
 end:  end:

Removed from v.1.3  
changed lines
  Added in v.1.3.12.4


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