/** * Sends an MQTT packet from multiple buffers in one system call write * @param socket the socket to which to write the data * @param header the one-byte MQTT header * @param count the number of buffers * @param buffers the rest of the buffers to write (not including remaining length) * @param buflens the lengths of the data in the array of buffers to be written * @return the completion code (TCPSOCKET_COMPLETE etc) */ int MQTTPacket_sends(int socket, Header header, int count, char** buffers, int* buflens) { int i, rc, buf0len, total = 0; char *buf; FUNC_ENTRY; buf = malloc(10); buf[0] = header.byte; for (i = 0; i < count; i++) total += buflens[i]; buf0len = 1 + MQTTPacket_encode(&buf[1], total); #if !defined(NO_PERSISTENCE) if (header.bits.type == PUBLISH && header.bits.qos != 0) { /* persist PUBLISH QoS1 and Qo2 */ char *ptraux = buffers[2]; int msgId = readInt(&ptraux); rc = MQTTPersistence_put(socket, buf, buf0len, count, buffers, buflens, header.bits.type, msgId, 0); } #endif rc = Socket_putdatas(socket, buf, buf0len, count, buffers, buflens); if (rc != TCPSOCKET_INTERRUPTED) free(buf); FUNC_EXIT_RC(rc); return rc; }
/** * Sends an MQTT packet from multiple buffers in one system call write * @param socket the socket to which to write the data * @param header the one-byte MQTT header * @param count the number of buffers * @param buffers the rest of the buffers to write (not including remaining length) * @param buflens the lengths of the data in the array of buffers to be written * @return the completion code (TCPSOCKET_COMPLETE etc) */ int MQTTPacket_sends(networkHandles* net, Header header, int count, char** buffers, size_t* buflens, int* frees) { int i, rc, buf0len, total = 0; char *buf; FUNC_ENTRY; buf = malloc(10); buf[0] = header.byte; for (i = 0; i < count; i++) total += buflens[i]; buf0len = 1 + MQTTPacket_encode(&buf[1], total); #if !defined(NO_PERSISTENCE) if (header.bits.type == PUBLISH && header.bits.qos != 0) { /* persist PUBLISH QoS1 and Qo2 */ char *ptraux = buffers[2]; int msgId = readInt(&ptraux); rc = MQTTPersistence_put(net->socket, buf, buf0len, count, buffers, buflens, header.bits.type, msgId, 0); } #endif #if defined(OPENSSL) if (net->ssl) rc = SSLSocket_putdatas(net->ssl, net->socket, buf, buf0len, count, buffers, buflens, frees); else #endif rc = Socket_putdatas(net->socket, buf, buf0len, count, buffers, buflens, frees); if (rc == TCPSOCKET_COMPLETE) time(&(net->lastSent)); if (rc != TCPSOCKET_INTERRUPTED) free(buf); FUNC_EXIT_RC(rc); return rc; }
/** * Sends an MQTT packet in one system call write * @param socket the socket to which to write the data * @param header the one-byte MQTT header * @param buffer the rest of the buffer to write (not including remaining length) * @param buflen the length of the data in buffer to be written * @return the completion code (TCPSOCKET_COMPLETE etc) */ int MQTTPacket_send(int socket, Header header, char* buffer, int buflen) { int rc, buf0len; char *buf; FUNC_ENTRY; buf = malloc(10); buf[0] = header.byte; buf0len = 1 + MQTTPacket_encode(&buf[1], buflen); #if !defined(NO_PERSISTENCE) if (header.bits.type == PUBREL) { char* ptraux = buffer; int msgId = readInt(&ptraux); rc = MQTTPersistence_put(socket, buf, buf0len, 1, &buffer, &buflen, header.bits.type, msgId, 0); } #endif rc = Socket_putdatas(socket, buf, buf0len, 1, &buffer, &buflen); if (rc != TCPSOCKET_INTERRUPTED) free(buf); FUNC_EXIT_RC(rc); return rc; }
/** * Sends an MQTT packet in one system call write * @param socket the socket to which to write the data * @param header the one-byte MQTT header * @param buffer the rest of the buffer to write (not including remaining length) * @param buflen the length of the data in buffer to be written * @return the completion code (TCPSOCKET_COMPLETE etc) */ int MQTTPacket_send(networkHandles* net, Header header, char* buffer, size_t buflen, int free) { int rc, buf0len; char *buf; FUNC_ENTRY; buf = malloc(10); buf[0] = header.byte; buf0len = 1 + MQTTPacket_encode(&buf[1], buflen); #if !defined(NO_PERSISTENCE) if (header.bits.type == PUBREL) { char* ptraux = buffer; int msgId = readInt(&ptraux); rc = MQTTPersistence_put(net->socket, buf, buf0len, 1, &buffer, &buflen, header.bits.type, msgId, 0); } #endif #if defined(OPENSSL) if (net->ssl) rc = SSLSocket_putdatas(net->ssl, net->socket, buf, buf0len, 1, &buffer, &buflen, &free); else #endif rc = Socket_putdatas(net->socket, buf, buf0len, 1, &buffer, &buflen, &free); if (rc == TCPSOCKET_COMPLETE) time(&(net->lastSent)); if (rc != TCPSOCKET_INTERRUPTED) free(buf); FUNC_EXIT_RC(rc); return rc; }