blob: cdfd548c8ffee3ff7edb566d415442cf788be054 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Allan Stockdill-Mander - initial API and implementation and/or initial documentation
*******************************************************************************/
// #include <openssl/ssl.h>
// #include <openssl/err.h>
#include "MQTTLinux.h"
//#include "global.h"
//#include "DC_iot_port.h"
#include "mbtk_sock2.h"
#define TIMEOUT 60*1000
char expired(Timer* timer)
{
struct timeval now, res;
gettimeofday(&now, NULL);
timersub(&timer->end_time, &now, &res);
return res.tv_sec < 0 || (res.tv_sec == 0 && res.tv_usec <= 0);
}
void countdown_ms(Timer* timer, unsigned int timeout)
{
struct timeval now;
gettimeofday(&now, NULL);
struct timeval interval = {timeout / 1000, (timeout % 1000) * 1000};
timeradd(&now, &interval, &timer->end_time);
}
void countdown(Timer* timer, unsigned int timeout)
{
struct timeval now;
gettimeofday(&now, NULL);
struct timeval interval = {timeout, 0};
timeradd(&now, &interval, &timer->end_time);
}
int left_ms(Timer* timer)
{
struct timeval now, res;
gettimeofday(&now, NULL);
timersub(&timer->end_time, &now, &res);
//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
return (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000;
}
void InitTimer(Timer* timer)
{
timer->end_time = (struct timeval){0, 0};
}
int linux_read(Network* n, unsigned char* buffer, int len, int timeout_ms)
{
int err;
int read_len = mbtk_sock_read(n->handle,n->my_socket, buffer, len, TIMEOUT, &err);
if(read_len < 0) {
if(err == MBTK_SOCK_ETIMEOUT) {
return -2;
} else {
return -1;
}
} else {
return read_len;
}
#if 0
struct timeval interval = {timeout_ms / 1000, (timeout_ms % 1000) * 1000};
//mDEBUG("[%s]timeout_ms = %d \n", __FUNCTION__, timeout_ms);
if (interval.tv_sec < 0 || (interval.tv_sec == 0 && interval.tv_usec <= 0))
{
interval.tv_sec = 0;
interval.tv_usec = 100;
}
setsockopt(n->my_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));
int bytes = 0;
while (bytes < len)
{
int rc = recv(n->my_socket, &buffer[bytes], (size_t)(len - bytes), 0);
//mDEBUG("[%s]socket recv rc = %d \n", __FUNCTION__, rc);
if(rc == 0)
{
//mDEBUG("[%s]socket close \n", __FUNCTION__);
bytes = 0;
break;
}
if (rc == -1)
{
if (errno != ENOTCONN && errno != ECONNRESET)
{
bytes = -1;
break;
}
}
else
bytes += rc;
}
return bytes;
#endif
}
int linux_write(Network* n, unsigned char* buffer, int len, int timeout_ms)
{
int err;
printf("Write[%d]:%s",len,(char*)buffer);
return mbtk_sock_write(n->handle, n->my_socket, buffer, len, TIMEOUT, &err);
#if 0
struct timeval tv;
tv.tv_sec = 0; /* 30 Secs Timeout */
tv.tv_usec = timeout_ms * 1000; // Not init'ing this can cause strange errors
setsockopt(n->my_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval));
int rc = write(n->my_socket, buffer, len);
return rc;
#endif
}
void linux_disconnect(Network* n)
{
int errno;
mbtk_sock_close(n->handle,n->my_socket,TIMEOUT,&errno);
}
void NewNetwork(Network* n)
{
n->my_socket = 0;
n->mqttread = linux_read;
n->mqttwrite = linux_write;
n->disconnect = linux_disconnect;
n->ingnore_cert = true;
n->is_support_ssl = false;
}
int ConnectNetwork(Network* n, char* addr, int port, bool is_support_ssl, bool ingnore_cert)
{
mbtk_init_info *info ;
mbtk_sock_info *sock_info;
int rc = 0;
int errno;
info = NULL;
sock_info = (mbtk_sock_info *)malloc(sizeof(mbtk_sock_info));
if(sock_info ==NULL)
{
rc = -1;
return rc;
}
memcpy(sock_info->address, addr, strlen(addr));
sock_info->port = port;
sock_info->is_support_ssl = is_support_ssl;
sock_info->ingnore_cert = ingnore_cert;
printf("host %s\nport %d\nis_support_ssl %d\ningnore_cert %d\n",sock_info->address,sock_info->port,sock_info->is_support_ssl,sock_info->ingnore_cert);
mbtk_sock_handle handle = mbtk_sock_init(info);
if (handle < 0 )
{
rc = -1;
return rc;
}
int fd = mbtk_sock_open(handle, sock_info, TIMEOUT, &errno);
if(fd < 0)
{
rc = -1;
return rc;
}
n->my_socket = fd;
n->handle = handle;
return rc;
}