int emulator_read(int device, char *data, int length, int timeout) { size_t size = 0; if (length == PACKET_RSP_HEADER_SIZE) { struct response_packet_t *response = (struct response_packet_t*) data; response->prefix = PACKET_PREFIX; response->data_length = sizeof(uint16_t); response->id = id; response->response_code = RSP_OK; response->data_length = getlenght(var); } else { size_t size = getlenght(var); if (device == handle_engine) { engine_read(var, data, size); } if (device == handle_senshub) { senshub_read(var, data, size); } if (device == handle_ble) { ble_device_read(var, data, size); } } return size; }
void engine_loop () { int maxfd; fd_set rfdset; fd_set wfdset; struct timeval tv; int fds; while (!exiting || nbclients > 0) { FD_ZERO (&rfdset); FD_ZERO (&wfdset); maxfd = -1; engine_set_readers (&rfdset, &maxfd); engine_set_writers (&wfdset, &maxfd); /* Wait for the end of created process to avoid zombie */ engine_wait_pids(); if (maxfd == -1) { /* * well... in fact this should not happen * or very rarely */ log (LOG_WARNING, _("engine - No data to wait\n")); sleep (ENGINE_TIMEOUT); fds = 0; /* simulate a timeout */ } else { tv.tv_sec = ENGINE_TIMEOUT; tv.tv_usec = 0; fds = select (maxfd + 1, &rfdset, &wfdset, NULL, &tv); } /* FIXME: find a better way of doing this */ if(!haccess->is_connected()) { log (LOG_WARNING, _("Server drop the connection.\n")); engine_stop(); } if (fds > 0) { engine_read (&rfdset); engine_write (&wfdset); engine_timeout (); } else { /* * There was no data to read/write */ debug (9, "engine - Timed out\n"); engine_timeout (); } if (exiting && nbclients > 0) engine_end_clients (); } debug (1, "engine - ended\n"); }