size_t connection_read_data(struct connection *conn, void *buffer, uint32_t len, int32_t timeout) { size_t ret = 0; MCDRV_ASSERT(buffer != NULL); MCDRV_ASSERT(conn->socket_descriptor != NULL); MCDRV_DBG_VERBOSE(mc_kapi, "read data len = %u for PID = %u", len, conn->sequence_magic); do { /* * Wait until data is available or timeout * msecs_to_jiffies(-1) -> wait forever for the sem */ if (down_timeout(&(conn->data_available_sem), msecs_to_jiffies(timeout))) { MCDRV_DBG_VERBOSE(mc_kapi, "Timeout reading the data sem"); ret = -2; break; } /*################################## #mobicore_security_team_add ##################################*/ /*if (mutex_lock_interruptible(&(conn->data_lock))) { MCDRV_DBG_ERROR(mc_kapi, "interrupted reading the data sem"); ret = -1; break; }*/ mutex_lock(&(conn->data_lock)); /*##################################*/ /* Have data, use it */ if (conn->data_len > 0) ret = connection_read_data_msg(conn, buffer, len); mutex_unlock(&(conn->data_lock)); /* There is still some data left */ if (conn->data_len > 0) up(&conn->data_available_sem); } while (0); return ret; }
size_t connection_read_data(struct connection *conn, void *buffer, uint32_t len, int32_t timeout) { size_t ret = 0; MCDRV_ASSERT(buffer != NULL); MCDRV_ASSERT(conn->socket_descriptor != NULL); MCDRV_DBG_VERBOSE(mc_kapi, "read data len = %u for PID = %u", len, conn->sequence_magic); do { if (down_timeout(&(conn->data_available_sem), msecs_to_jiffies(timeout))) { MCDRV_DBG_VERBOSE(mc_kapi, "Timeout reading the data sem"); ret = -2; break; } if (mutex_lock_interruptible(&(conn->data_lock))) { MCDRV_DBG_ERROR(mc_kapi, "interrupted reading the data sem"); ret = -1; break; } if (conn->data_len > 0) ret = connection_read_data_msg(conn, buffer, len); mutex_unlock(&(conn->data_lock)); if (conn->data_len > 0) up(&conn->data_available_sem); } while (0); return ret; }