Beispiel #1
0
/**
 * Fully initialize the socket module for in and outbound communications.
 * In multi-listener mode.
 * @param myListeners list of listeners
 * @return completion code
 */
int Socket_initialize(List* myListeners)
{
	ListElement* current = NULL;
	int rc = 0;

	FUNC_ENTRY;
	s.listeners = myListeners;
	Socket_outInitialize();
	while (ListNextElement(s.listeners, &current))
	{
		Listener* list = (Listener*)(current->content);
		if ((rc = Socket_addServerSocket(list)) != 0)
		{
			Log(LOG_WARNING, 15, NULL, list->port);
			break;
		}
	}
	FUNC_EXIT_RC(rc);
	return rc;
}
Beispiel #2
0
/**
 * Fully initialize the socket module for in and outbound communications.
 * In single-listener mode.
 * @param anAddress IP address string
 * @param port number
 * @param ipv6 flag to indicate ipv6 should be used
 * @return completion code
 */
int Socket_initialize(char* anAddress, int aPort, int ipv6)
{
	int flag = 1;
	int rc = SOCKET_ERROR;
	int ipv4 = 1; /* yes we can drop down to ipv4 */

	FUNC_ENTRY;
	s.port = aPort;
	if (anAddress == NULL || strcmp(anAddress, "INADDR_ANY") == 0)
	{
		s.addr.sin_addr.s_addr = htonl(INADDR_ANY);
		s.addr6.sin6_addr = in6addr_any;
	}
	else
	{
		if (anAddress[0] == '[')
		{
			int changed = ipv6_format(anAddress);
			inet_pton(AF_INET6, &anAddress[1], &(s.addr6.sin6_addr));
			ipv4 = 0;
			if (changed)
				(anAddress)[changed] = ']';
		}
		else
		{
			inet_pton(AF_INET, anAddress, &(s.addr.sin_addr.s_addr));
			ipv6 = 0;
		}
	}
	Socket_outInitialize();
	s.mySocket = -1;
	if (ipv6)
		s.mySocket = socket(AF_INET6, SOCK_STREAM, 0);
	if (s.mySocket < 0 && ipv4)
	{
		s.mySocket = socket(AF_INET, SOCK_STREAM, 0);
		ipv6 = 0;
	}
	s.maxfdp1 = 0;
	Log(TRACE_MAX, 6, NULL, FD_SETSIZE);
	if (s.mySocket < 0)
	{
		Socket_error("socket", s.mySocket);
		Log(LOG_WARNING, 77, NULL);
		rc = s.mySocket;
		goto exit;
	}

#if !defined(WIN32)
	if (setsockopt(s.mySocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&flag, sizeof(int)) != 0)
		Log(LOG_WARNING, 109, NULL, aPort);
#endif
	if (ipv6)
	{
		s.addr6.sin6_family = AF_INET6;
		s.addr6.sin6_port = htons(s.port);
		rc = bind(s.mySocket, (struct sockaddr *)&(s.addr6), sizeof(s.addr6));
	}
	else
	{
		s.addr.sin_family = AF_INET;
		s.addr.sin_port = htons(s.port);
		memset(s.addr.sin_zero, 0, sizeof(s.addr.sin_zero));
		rc = bind(s.mySocket, (struct sockaddr *)&(s.addr), sizeof(s.addr));
	}
	if (rc == SOCKET_ERROR)
	{
		Socket_error("bind", s.mySocket);
		Log(LOG_WARNING, 78, NULL, aPort);
		goto exit;
	}
	if (listen(s.mySocket, SOMAXCONN) == SOCKET_ERROR) /* second parm is max no of connections */
	{
		Socket_error("listen", s.mySocket);
		Log(LOG_WARNING, 79, NULL, aPort);
		goto exit;
	}
	if (Socket_setnonblocking(s.mySocket) == SOCKET_ERROR)
	{
		Socket_error("setnonblocking", s.mySocket);
		goto exit;
	}
	FD_SET((u_int)s.mySocket, &(s.rset));         /* Add the current socket descriptor */
	s.maxfdp1 = s.mySocket + 1;
	memcpy((void*)&(s.rset_saved), (void*)&(s.rset), sizeof(s.rset_saved));
	rc = 0;
exit:
	FUNC_EXIT_RC(rc);
	return rc;
}
Beispiel #3
0
int MQTTClient_create(MQTTClient* handle, const char* serverURI, const char* clientId,
		int persistence_type, void* persistence_context)
{
	int rc = 0;
	MQTTClients *m = NULL;

	FUNC_ENTRY;
	rc = Thread_lock_mutex(mqttclient_mutex);

	if (serverURI == NULL || clientId == NULL)
	{
		rc = MQTTCLIENT_NULL_PARAMETER;
		goto exit;
	}

	if (!UTF8_validateString(clientId))
	{
		rc = MQTTCLIENT_BAD_UTF8_STRING;
		goto exit;
	}

	if (!initialized)
	{
		#if defined(HEAP_H)
			Heap_initialize();
		#endif
		Log_initialize((Log_nameValue*)MQTTClient_getVersionInfo());
		bstate->clients = ListInitialize();
		Socket_outInitialize();
		Socket_setWriteCompleteCallback(MQTTClient_writeComplete);
		handles = ListInitialize();
#if defined(OPENSSL)
		SSLSocket_initialize();
#endif
		initialized = 1;
	}
	m = malloc(sizeof(MQTTClients));
	*handle = m;
	memset(m, '\0', sizeof(MQTTClients));
	if (strncmp(URI_TCP, serverURI, strlen(URI_TCP)) == 0)
		serverURI += strlen(URI_TCP);
#if defined(OPENSSL)
	else if (strncmp(URI_SSL, serverURI, strlen(URI_SSL)) == 0)
	{
		serverURI += strlen(URI_SSL);
		m->ssl = 1;
	}
#endif
	m->serverURI = MQTTStrdup(serverURI);
	ListAppend(handles, m, sizeof(MQTTClients));

	m->c = malloc(sizeof(Clients));
	memset(m->c, '\0', sizeof(Clients));
	m->c->context = m;
	m->c->outboundMsgs = ListInitialize();
	m->c->inboundMsgs = ListInitialize();
	m->c->messageQueue = ListInitialize();
	m->c->clientID = MQTTStrdup(clientId);
	m->connect_sem = Thread_create_sem();
	m->connack_sem = Thread_create_sem();
	m->suback_sem = Thread_create_sem();
	m->unsuback_sem = Thread_create_sem();

#if !defined(NO_PERSISTENCE)
	rc = MQTTPersistence_create(&(m->c->persistence), persistence_type, persistence_context);
	if (rc == 0)
	{
		rc = MQTTPersistence_initialize(m->c, m->serverURI);
		if (rc == 0)
			MQTTPersistence_restoreMessageQueue(m->c);
	}
#endif
	ListAppend(bstate->clients, m->c, sizeof(Clients) + 3*sizeof(List));

exit:
	Thread_unlock_mutex(mqttclient_mutex);
	FUNC_EXIT_RC(rc);
	return rc;
}
Beispiel #4
0
int MQTTClient_create(MQTTClient* handle, char* serverURI, char* clientId,
		int persistence_type, void* persistence_context)
{
	int rc = 0;
	MQTTClients *m = NULL;

	FUNC_ENTRY;
	rc = Thread_lock_mutex(mqttclient_mutex);

	if (serverURI == NULL || clientId == NULL)
	{
		rc = MQTTCLIENT_NULL_PARAMETER;
		goto exit;
	}

	if (!UTF8_validateString(clientId))
	{
		rc = MQTTCLIENT_BAD_UTF8_STRING;
		goto exit;
	}

	if (!initialized)
	{
		#if defined(HEAP_H)
			Heap_initialize();
		#endif
		Log_initialize();
		bstate->clients = ListInitialize();
		Socket_outInitialize();
		handles = ListInitialize();
		initialized = 1;
	}
	m = malloc(sizeof(MQTTClients));
	*handle = m;
	memset(m, '\0', sizeof(MQTTClients));
	if (strncmp(URI_TCP, serverURI, strlen(URI_TCP)) == 0)
		serverURI += strlen(URI_TCP);
	m->serverURI = malloc(strlen(serverURI)+1);
	strcpy(m->serverURI, serverURI);
	ListAppend(handles, m, sizeof(MQTTClients));

	m->c = malloc(sizeof(Clients));
	memset(m->c, '\0', sizeof(Clients));
	m->c->outboundMsgs = ListInitialize();
	m->c->inboundMsgs = ListInitialize();
	m->c->messageQueue = ListInitialize();
	m->c->clientID = malloc(strlen(clientId)+1);
	strcpy(m->c->clientID, clientId);
	m->connect_sem = Thread_create_sem();
	m->connack_sem = Thread_create_sem();
	m->suback_sem = Thread_create_sem();
	m->unsuback_sem = Thread_create_sem();

#if !defined(NO_PERSISTENCE)
	rc = MQTTPersistence_create(&(m->c->persistence), persistence_type, persistence_context);
	if (rc == 0)
		rc = MQTTPersistence_initialize(m->c, m->serverURI);
#endif
	ListAppend(bstate->clients, m->c, sizeof(Clients) + 3*sizeof(List));

exit:
	if (Thread_unlock_mutex(mqttclient_mutex) != 0)
		/* FFDC? */;
	FUNC_EXIT_RC(rc);
	return rc;
}