Add toolchain and mbtk source
Change-Id: Ie12546301367ea59240bf23d5e184ad7e36e40b3
diff --git a/mbtk/mbtk_mqtt/MQTTLinux.c b/mbtk/mbtk_mqtt/MQTTLinux.c
new file mode 100755
index 0000000..cdfd548
--- /dev/null
+++ b/mbtk/mbtk_mqtt/MQTTLinux.c
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * 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;
+}