|
version 1.1.2.10, 2011/12/29 14:13:13
|
version 1.4.4.2, 2013/07/19 09:11:48
|
|
Line 1
|
Line 1
|
| #include "global.h" | /************************************************************************* |
| #include "mqtt.h" | * (C) 2011 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com> |
| | * by Michael Pounov <misho@openbsd-bg.org> |
| | * |
| | * $Author$ |
| | * $Id$ |
| | * |
| | ************************************************************************** |
| | The ELWIX and AITNET software is distributed under the following |
| | terms: |
| |
|
| |
All of the documentation and software included in the ELWIX and AITNET |
| |
Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
| |
|
| int | Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 |
| InitClient(void) | by Michael Pounov <misho@elwix.org>. All rights reserved. |
| { | |
| int sock; | |
| |
|
| sock = socket(args->addr.sa.sa_family, SOCK_STREAM, IPPROTO_TCP); | Redistribution and use in source and binary forms, with or without |
| if (sock == -1) { | modification, are permitted provided that the following conditions |
| printf("Error:: socket() #%d - %s\n", errno, strerror(errno)); | are met: |
| return -1; | 1. Redistributions of source code must retain the above copyright |
| } | notice, this list of conditions and the following disclaimer. |
| if (connect(sock, &args->addr.sa, args->addr.sa.sa_len) == -1) { | 2. Redistributions in binary form must reproduce the above copyright |
| printf("Error:: connect() #%d - %s\n", errno, strerror(errno)); | notice, this list of conditions and the following disclaimer in the |
| return -1; | documentation and/or other materials provided with the distribution. |
| } | 3. All advertising materials mentioning features or use of this software |
| | must display the following acknowledgement: |
| | This product includes software developed by Michael Pounov <misho@elwix.org> |
| | ELWIX - Embedded LightWeight unIX and its contributors. |
| | 4. Neither the name of AITNET nor the names of its contributors |
| | may be used to endorse or promote products derived from this software |
| | without specific prior written permission. |
| |
|
| return sock; | THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND |
| } | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
| | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| | HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| | SUCH DAMAGE. |
| | */ |
| | #include "global.h" |
| | #include "mqtt.h" |
| | #include "client.h" |
| |
|
| |
|
| int |
int |
| ConnectClient(int sock) |
ConnectClient(int sock) |
| { |
{ |
|
Line 40 ConnectClient(int sock)
|
Line 68 ConnectClient(int sock)
|
| printf("Error:: send() #%d - %s\n", errno, strerror(errno)); |
printf("Error:: send() #%d - %s\n", errno, strerror(errno)); |
| return -1; |
return -1; |
| } else |
} else |
| ioVERBOSE(3) printf("Sended CONNECT %d bytes\n", siz); | EVERBS(3) printf("Sended CONNECT %d bytes\n", siz); |
| |
|
| pfd.fd = sock; |
pfd.fd = sock; |
| pfd.events = POLLIN | POLLPRI; |
pfd.events = POLLIN | POLLPRI; |
|
Line 49 ConnectClient(int sock)
|
Line 77 ConnectClient(int sock)
|
| printf("Error:: poll() #%d - %s\n", errno, strerror(errno)); |
printf("Error:: poll() #%d - %s\n", errno, strerror(errno)); |
| return -1; |
return -1; |
| case 0: |
case 0: |
| ioVERBOSE(3) printf("Timeout reached (%d) ...\n", args->ka * 1000); | EVERBS(3) printf("Timeout reached (%d) ...\n", args->ka * 1000); |
| return -1; |
return -1; |
| } |
} |
| if (pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) |
if (pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) |
| return -1; |
return -1; |
| |
|
| |
memset(args->msg->msg_base, 0, args->msg->msg_len); |
| siz = recv(sock, args->msg->msg_base, args->msg->msg_len, 0); |
siz = recv(sock, args->msg->msg_base, args->msg->msg_len, 0); |
| if (siz == -1) { |
if (siz == -1) { |
| printf("Error:: recv() #%d - %s\n", errno, strerror(errno)); |
printf("Error:: recv() #%d - %s\n", errno, strerror(errno)); |
| return -1; |
return -1; |
| } else |
} else |
| ioVERBOSE(3) printf("Received %d bytes\n", siz); | EVERBS(3) printf("Received %d bytes\n", siz); |
| |
|
| return (u_char) mqtt_readCONNACK(args->msg); |
return (u_char) mqtt_readCONNACK(args->msg); |
| } |
} |
| |
|
| int | void * |
| CloseClient(int sock) | OpenFile(void) |
| { |
{ |
| int siz = 0; | int f, siz = 0; |
| | void *mem; |
| |
|
| siz = mqtt_msgDISCONNECT(args->msg); | if (!args->isFile) |
| if (siz == -1) { | return NULL; |
| printf("Error:: msgDISCONNECT #%d - %s\n", mqtt_GetErrno(), mqtt_GetError()); | |
| return -1; | f = open(AIT_GET_STR(&args->Value), O_RDONLY); |
| | if (f == -1) { |
| | printf("Error:: in open file #%d - %s\n", errno, strerror(errno)); |
| | return NULL; |
| } |
} |
| |
mem = mmap(NULL, siz, PROT_READ, MAP_PRIVATE, f, 0); |
| |
if (mem == MAP_FAILED) { |
| |
printf("Error:: in map file #%d - %s\n", errno, strerror(errno)); |
| |
close(f); |
| |
return NULL; |
| |
} else |
| |
close(f); |
| |
|
| siz = send(sock, args->msg->msg_base, siz, 0); | AIT_SET_PTR(&args->Value, mem, siz); |
| | return mem; |
| | } |
| | |
| | void |
| | CloseFile(void) |
| | { |
| | if (args->isFile) { |
| | munmap(AIT_GET_PTR(&args->Value), AIT_LEN(&args->Value)); |
| | AIT_FREE_VAL(&args->Value); |
| | } |
| | } |
| | |
| | int |
| | SendTo(int sock, int siz) |
| | { |
| | siz = send(sock, args->msg->msg_base, siz, MSG_NOSIGNAL); |
| if (siz == -1) { |
if (siz == -1) { |
| printf("Error:: send() #%d - %s\n", errno, strerror(errno)); |
printf("Error:: send() #%d - %s\n", errno, strerror(errno)); |
| return -1; |
return -1; |
| } else |
} else |
| ioVERBOSE(3) printf("Sended DISCONNECT %d bytes\n", siz); | EVERBS(3) printf("Sended %d bytes\n", siz); |
| |
|
| close(sock); |
|
| return siz; |
return siz; |
| } |
} |
| |
|
| int |
int |
| KAClient(int sock) | RecvFrom(int sock) |
| { |
{ |
| int siz = 0; |
|
| struct pollfd pfd; |
struct pollfd pfd; |
| |
int siz = 0; |
| |
|
| siz = mqtt_msgPINGREQ(args->msg); | memset(args->msg->msg_base, 0, args->msg->msg_len); |
| if (siz == -1) { | |
| printf("Error:: msgPINGREQ #%d - %s\n", mqtt_GetErrno(), mqtt_GetError()); | |
| return -1; | |
| } | |
| |
|
| siz = send(sock, args->msg->msg_base, siz, 0); |
|
| if (siz == -1) { |
|
| printf("Error:: send() #%d - %s\n", errno, strerror(errno)); |
|
| return -1; |
|
| } else |
|
| ioVERBOSE(3) printf("Sended PINGREQ %d bytes\n", siz); |
|
| |
|
| pfd.fd = sock; |
pfd.fd = sock; |
| pfd.events = POLLIN | POLLPRI; |
pfd.events = POLLIN | POLLPRI; |
| switch (poll(&pfd, 1, args->ka * 1000)) { | do { |
| case -1: | switch (poll(&pfd, 1, args->ka * 1000)) { |
| printf("Error:: poll() #%d - %s\n", errno, strerror(errno)); | case -1: |
| | printf("Error:: poll() #%d - %s\n", errno, strerror(errno)); |
| | return -1; |
| | case 0: |
| | EVERBS(3) printf("Timeout reached (%d) ...\n", args->ka * 1000); |
| | if (mqtt_KeepAlive(sock, args->ka, 1) == -1) |
| | return -1; |
| | continue; |
| | } |
| | if (pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) |
| return -1; |
return -1; |
| case 0: | } while (0); |
| ioVERBOSE(3) printf("Timeout reached (%d) ...\n", args->ka * 1000); | |
| return -1; | |
| } | |
| if (pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) | |
| return -1; | |
| |
|
| siz = recv(sock, args->msg->msg_base, args->msg->msg_len, 0); |
siz = recv(sock, args->msg->msg_base, args->msg->msg_len, 0); |
| if (siz == -1) { |
if (siz == -1) { |
| printf("Error:: recv() #%d - %s\n", errno, strerror(errno)); |
printf("Error:: recv() #%d - %s\n", errno, strerror(errno)); |
| return -1; |
return -1; |
| } else |
} else |
| ioVERBOSE(3) printf("Received %d bytes\n", siz); | EVERBS(3) printf("Received %d bytes\n", siz); |
| |
|
| return (u_char) mqtt_readPINGRESP(args->msg); | return siz; |
| } | |
| |
| FILE * | |
| OpenFile(void) | |
| { | |
| if (!args->isFile) | |
| return NULL; | |
| |
| args->isFile = fopen(AIT_GET_STR(&args->Value), "r"); | |
| if (!args->isFile) { | |
| printf("Error:: in open file #%d - %s\n", errno, strerror(errno)); | |
| return NULL; | |
| } | |
| |
| return args->isFile; | |
| } | |
| |
| void | |
| CloseFile(void) | |
| { | |
| if (args->isFile) | |
| fclose(args->isFile); | |
| } |
} |