/** * 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, ¤t)) { 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; }
/** * 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; }
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; }
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; }