//-------------------------------------------------------------------------------------------------- void AtClientServer ( SharedData_t* sharedDataPtr ) { struct sockaddr_un addr; int epollFd; struct epoll_event event; char monitorName[MAX_LEN_MONITOR_NAME]; le_fdMonitor_Ref_t fdMonitorRef; LE_INFO("AtClientServer Started !!!"); ClientData.socketFd = socket(AF_UNIX, SOCK_STREAM, 0); LE_ASSERT(ClientData.socketFd != -1); epollFd = epoll_create1(0); LE_ASSERT(epollFd != -1); event.events = EPOLLIN | EPOLLRDHUP; event.data.fd = ClientData.socketFd; LE_ASSERT(epoll_ctl(epollFd, EPOLL_CTL_ADD, ClientData.socketFd, &event) == 0); memset(&addr, 0, sizeof(addr)); addr.sun_family= AF_UNIX; strncpy(addr.sun_path, sharedDataPtr->devPathPtr, sizeof(addr.sun_path)-1); LE_ASSERT(bind(ClientData.socketFd, (struct sockaddr*) &addr, sizeof(addr)) != -1); LE_ASSERT(listen(ClientData.socketFd, 1) != -1); le_sem_Post(sharedDataPtr->semRef); ClientData.connFd = accept(ClientData.socketFd, NULL, NULL); LE_ASSERT(ClientData.connFd != -1); le_sem_Post(sharedDataPtr->semRef); snprintf(monitorName, sizeof(monitorName), "Monitor-%d", ClientData.connFd); fdMonitorRef = le_fdMonitor_Create(monitorName, dup(ClientData.connFd), RxNewData, POLLIN | POLLPRI | POLLRDHUP); le_fdMonitor_SetContextPtr(fdMonitorRef, sharedDataPtr); }
//-------------------------------------------------------------------------------------------------- le_json_ParsingSessionRef_t le_json_Parse ( int fd, ///< File descriptor to read the JSON document from. le_json_EventHandler_t eventHandler, ///< Function to call when normal parsing events happen. le_json_ErrorHandler_t errorHandler, ///< Function to call when errors happen. void* opaquePtr ///< Opaque pointer to be fetched by handlers using le_json_GetOpaquePtr(). ) //-------------------------------------------------------------------------------------------------- { // Create a Parser. Parser_t* parserPtr = NewParser(eventHandler, errorHandler, opaquePtr); parserPtr->fd = fd; parserPtr->fdMonitor = le_fdMonitor_Create("le_json", fd, FdEventHandler, POLLIN); le_fdMonitor_SetContextPtr(parserPtr->fdMonitor, parserPtr); // Create the top-level context and push it onto the context stack. PushContext(parserPtr, LE_JSON_CONTEXT_DOC, eventHandler); return parserPtr; }
static int mqttClient_connect(mqttClient_t* clientData) { struct sockaddr_in address; struct addrinfo *result = NULL; struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL}; int rc = LE_OK; LE_ASSERT(clientData); if (clientData->session.sock != MQTT_CLIENT_INVALID_SOCKET) { LE_WARN("socket already connected"); goto cleanup; } rc = getaddrinfo(clientData->session.config.brokerUrl, NULL, &hints, &result); if (rc) { LE_ERROR("getaddrinfo() failed(%d)", rc); goto cleanup; } struct addrinfo* res = result; while (res) { if (res->ai_family == AF_INET) { result = res; break; } res = res->ai_next; } if (result->ai_family == AF_INET) { address.sin_port = htons(clientData->session.config.portNumber); address.sin_family = AF_INET; address.sin_addr = ((struct sockaddr_in*)(result->ai_addr))->sin_addr; } else { LE_ERROR("find IP('%s') failed", clientData->session.config.brokerUrl); rc = LE_FAULT; goto cleanup; } clientData->session.sock = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); if (clientData->session.sock == -1) { LE_ERROR("socket() failed(%d)", errno); rc = clientData->session.sock; goto cleanup; } clientData->session.sockFdMonitor = le_fdMonitor_Create(MQTT_CLIENT_SOCKET_MONITOR_NAME, clientData->session.sock, mqttClient_socketFdEventHandler, POLLIN | POLLOUT); if (!clientData->session.sockFdMonitor) { LE_ERROR("le_fdMonitor_Create() failed"); rc = LE_FAULT; goto cleanup; } le_fdMonitor_SetContextPtr(clientData->session.sockFdMonitor, clientData); clientData->session.tx.ptr = clientData->session.tx.buf; clientData->session.rx.ptr = clientData->session.rx.buf; rc = connect(clientData->session.sock, (struct sockaddr*)&address, sizeof(address)); if (rc == -1) { rc = le_timer_Start(clientData->session.connTimer); if (rc) { LE_ERROR("le_timer_Start() failed(%d)", rc); goto cleanup; } if (errno != EINPROGRESS) { LE_ERROR("connect() failed(%d)", errno); rc = LE_FAULT; goto cleanup; } LE_DEBUG("connecting('%s')", clientData->session.config.brokerUrl); rc = LE_OK; goto cleanup; } LE_DEBUG("connected('%s')", clientData->session.config.brokerUrl); cleanup: freeaddrinfo(result); if (rc && (clientData->session.sock != MQTT_CLIENT_INVALID_SOCKET)) { int err = mqttClient_close(clientData); if (err) { LE_ERROR("mqttClient_close() failed(%d)", err); goto cleanup; } } return rc; }