aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Eisenbach <eisenbach@google.com>2016-05-30 12:00:46 -0700
committerAndre Eisenbach <eisenbach@google.com>2016-05-30 19:11:16 +0000
commit32d66694e9f782a0e9dfa423015284a573f8975c (patch)
treee10bb2e657c786412081cfc4129fff8e14949624
parent6834570262116974a176cd8598b6d0ca6d031aca (diff)
downloadbt-32d66694e9f782a0e9dfa423015284a573f8975c.tar.gz
HID: Check for EINTR in uhid_event() and fix return value evaluation
uhid_event() returns 0 in the normal case. Commit 3a2c2d61 results in the polling thread to be exited. Bug: 28942565 Change-Id: Id0aff2958bc7c2704ba340aa0ff7848afb8dcf80
-rw-r--r--btif/co/bta_hh_co.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/btif/co/bta_hh_co.c b/btif/co/bta_hh_co.c
index 07258be3e..c95a19dc9 100644
--- a/btif/co/bta_hh_co.c
+++ b/btif/co/bta_hh_co.c
@@ -16,26 +16,25 @@
*
******************************************************************************/
-//#if (defined(BTA_HH_INCLUDED) && (BTA_HH_INCLUDED == TRUE))
-
+#include <assert.h>
#include <ctype.h>
+#include <errno.h>
#include <fcntl.h>
-#include <sys/poll.h>
+#include <linux/uhid.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
-#include <errno.h>
-#include <unistd.h>
-#include <linux/uhid.h>
+#include <sys/poll.h>
#include <unistd.h>
+
+#include "btcore/include/bdaddr.h"
#include "osi/include/osi.h"
-#include "btif_hh.h"
#include "bta_api.h"
#include "bta_hh_api.h"
-#include "btif_util.h"
#include "bta_hh_co.h"
-#include "btcore/include/bdaddr.h"
+#include "btif_hh.h"
+#include "btif_util.h"
const char *dev_path = "/dev/uhid";
@@ -61,8 +60,8 @@ void uhid_set_non_blocking(int fd)
static int uhid_write(int fd, const struct uhid_event *ev)
{
ssize_t ret;
-
OSI_NO_INTR(ret = write(fd, ev, sizeof(*ev)));
+
if (ret < 0){
int rtn = -errno;
APPL_TRACE_ERROR("%s: Cannot write to uhid:%s",
@@ -78,17 +77,16 @@ static int uhid_write(int fd, const struct uhid_event *ev)
}
/* Internal function to parse the events received from UHID driver*/
-static int uhid_event(btif_hh_device_t *p_dev)
+static int uhid_read_event(btif_hh_device_t *p_dev)
{
+ assert(p_dev);
+
struct uhid_event ev;
- ssize_t ret;
memset(&ev, 0, sizeof(ev));
- if(!p_dev)
- {
- APPL_TRACE_ERROR("%s: Device not found",__FUNCTION__)
- return -1;
- }
- ret = read(p_dev->fd, &ev, sizeof(ev));
+
+ ssize_t ret;
+ OSI_NO_INTR(ret = read(p_dev->fd, &ev, sizeof(ev)));
+
if (ret == 0) {
APPL_TRACE_ERROR("%s: Read HUP on uhid-cdev %s", __FUNCTION__,
strerror(errno));
@@ -217,8 +215,8 @@ static void *btif_hh_poll_event_thread(void *arg)
}
if (pfds[0].revents & POLLIN) {
APPL_TRACE_DEBUG("%s: POLLIN", __func__);
- ret = uhid_event(p_dev);
- if (ret != -EINTR)
+ ret = uhid_read_event(p_dev);
+ if (ret != 0)
break;
}
}