From nobody Mon May 6 18:47:34 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490522094229615.4065206539906; Sun, 26 Mar 2017 02:54:54 -0700 (PDT) Received: from localhost ([::1]:40208 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cs4sv-0006bf-2d for importer@patchew.org; Sun, 26 Mar 2017 05:54:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39170) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cs4s8-0006KI-1k for qemu-devel@nongnu.org; Sun, 26 Mar 2017 05:54:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cs4s4-0000zU-VT for qemu-devel@nongnu.org; Sun, 26 Mar 2017 05:54:04 -0400 Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]:33562) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cs4s4-0000z3-OF for qemu-devel@nongnu.org; Sun, 26 Mar 2017 05:54:00 -0400 Received: by mail-wr0-x243.google.com with SMTP id 20so4283593wrx.0 for ; Sun, 26 Mar 2017 02:54:00 -0700 (PDT) Received: from localhost.localdomain (208.red-83-50-117.dynamicip.rima-tde.net. [83.50.117.208]) by smtp.gmail.com with ESMTPSA id c17sm10141539wre.30.2017.03.26.02.53.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 26 Mar 2017 02:53:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=Wwz8a6zqqQZeqcUN/6y4RKDdZvQVvhaX3R9sd9o+omI=; b=pnePt5UIdP6IhmQUS5v17cM12b9wegjlfORTNt7MM4aNnrZjhQrRzMd1mm1eZzLf73 Pzocb+sEvjbtrO5E4WAP7dRJFawIcaog4hQoUatusWOYAiaqaU+XwYhQOD4O5S4gEzPB ykBSs+qRojIfG/4uzIcf54jdzZBD0HYbmMloyfA3sGWNGcMGCDtpe9Cd7dw1kIMxN77F PrXhtl6XrP08bgDoo7jfaUtnA0aFZHqf1RAzc0FRnw7/43Qgdkf2HlFC19vj5tF7oh48 lUY7cB5a8z00X6+qGuHHCcqu6Ag5zyIRBYjcu64R4kfpgwXFRtJoKiX+Yj5N9h2Su1RI S0MQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Wwz8a6zqqQZeqcUN/6y4RKDdZvQVvhaX3R9sd9o+omI=; b=b407ydEk4kqce+zVun/zya8WrgDGBhJnhK5rLX6xDtXnFNU//LQzTFbN7lQ39RCYuX JSIOUEXviM3AI2y/ndwdIA4PbnghZHXOhtfegtdeQJNrAy1HwZYIARFaryEVe/nbXFjG HO2JItEhAxYT1K7O2AaXadbPe34DAYjyL1z52z17S5IvisWxY3wHzVlf4WGFwAxGWsXR KtAqY4O7EfKEEf4ygSutkugZa5pmjwDoJZR9KwmK/pleNok15OUZ48g3HLbT2+Fh8CBQ 4zJpWqlljfZV2oNKl2P2A4K5strcY87Usnlj2OuzBob5xesWXY8zKXg+K9wZEgemhlq0 kpqg== X-Gm-Message-State: AFeK/H006+LoMKOxWhEekkj1hCdtkDcOq6qqjM8/7rYfZ8IGA/zEIlcFBO+LuVcCeWC8xg== X-Received: by 10.28.7.144 with SMTP id 138mr5188825wmh.125.1490522039546; Sun, 26 Mar 2017 02:53:59 -0700 (PDT) From: Javier Celaya To: qemu-devel@nongnu.org Date: Sun, 26 Mar 2017 11:53:49 +0200 Message-Id: <20170326095349.8571-1-jcelaya@gmail.com> X-Mailer: git-send-email 2.11.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::243 Subject: [Qemu-devel] [PATCH v2] Fix input-linux reading from device X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kraxel@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The evdev devices in input-linux.c are read in blocks of one whole event. If there are not enough bytes available, they are discarded, instead of being kept for the next read operation. This results in lost events, of even non-working devices. This patch keeps track of the number of bytes to be read to fill up a whole event, and then handle it. Signed-off-by: Javier Celaya --- ui/input-linux.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/ui/input-linux.c b/ui/input-linux.c index ac31f47719..02b0d4b2fe 100644 --- a/ui/input-linux.c +++ b/ui/input-linux.c @@ -169,6 +169,8 @@ struct InputLinux { bool has_abs_x; int num_keys; int num_btns; + struct input_event event; + int to_be_read; =20 QTAILQ_ENTRY(InputLinux) next; }; @@ -327,25 +329,30 @@ static void input_linux_handle_mouse(InputLinux *il, = struct input_event *event) static void input_linux_event(void *opaque) { InputLinux *il =3D opaque; - struct input_event event; int rc; + int offset; + uint8_t *p =3D (uint8_t *)&il->event; =20 for (;;) { - rc =3D read(il->fd, &event, sizeof(event)); - if (rc !=3D sizeof(event)) { + offset =3D sizeof(il->event) - il->to_be_read; + rc =3D read(il->fd, &p[offset], il->to_be_read); + if (rc !=3D il->to_be_read) { if (rc < 0 && errno !=3D EAGAIN) { fprintf(stderr, "%s: read: %s\n", __func__, strerror(errno= )); qemu_set_fd_handler(il->fd, NULL, NULL, NULL); close(il->fd); + } else if (rc > 0){ + il->to_be_read -=3D rc; } break; } + il->to_be_read =3D sizeof(il->event); =20 if (il->num_keys) { - input_linux_handle_keyboard(il, &event); + input_linux_handle_keyboard(il, &il->event); } if (il->has_rel_x && il->num_btns) { - input_linux_handle_mouse(il, &event); + input_linux_handle_mouse(il, &il->event); } } } @@ -417,6 +424,7 @@ static void input_linux_complete(UserCreatable *uc, Err= or **errp) } } =20 + il->to_be_read =3D sizeof(il->event); qemu_set_fd_handler(il->fd, input_linux_event, NULL, il); if (il->keycount) { /* delay grab until all keys are released */ --=20 2.11.0