summaryrefslogtreecommitdiff
path: root/android/hal-ipc.c
diff options
context:
space:
mode:
authorSzymon Janc <szymon.janc@tieto.com>2014-05-20 12:49:48 +0200
committerSzymon Janc <szymon.janc@tieto.com>2014-06-12 13:04:30 +0200
commitc7bdb67bc3a15ce7c9f4ec406eaa5d5fa63ae827 (patch)
treed192ba8bd32eaf8e464c90e56ed2fe6ea4a651e9 /android/hal-ipc.c
parente95e9c04c37ce9d42783b72d039145d2dee6deb9 (diff)
downloadbluez-c7bdb67bc3a15ce7c9f4ec406eaa5d5fa63ae827.tar.gz
android/hal-ipc: Move exit calls outside of handle_msg
This reduce number of exit points in preparation for destroy callback.
Diffstat (limited to 'android/hal-ipc.c')
-rw-r--r--android/hal-ipc.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/android/hal-ipc.c b/android/hal-ipc.c
index ee3a04cf4..abb3b4b50 100644
--- a/android/hal-ipc.c
+++ b/android/hal-ipc.c
@@ -62,41 +62,39 @@ void hal_ipc_unregister(uint8_t service)
services[service].size = 0;
}
-static void handle_msg(void *buf, ssize_t len)
+static bool handle_msg(void *buf, ssize_t len)
{
struct ipc_hdr *msg = buf;
const struct hal_ipc_handler *handler;
uint8_t opcode;
if (len < (ssize_t) sizeof(*msg)) {
- error("IPC: message too small (%zd bytes), aborting", len);
- exit(EXIT_FAILURE);
+ error("IPC: message too small (%zd bytes)", len);
+ return false;
}
if (len != (ssize_t) (sizeof(*msg) + msg->len)) {
- error("IPC: message malformed (%zd bytes), aborting", len);
- exit(EXIT_FAILURE);
+ error("IPC: message malformed (%zd bytes)", len);
+ return false;
}
/* if service is valid */
if (msg->service_id > HAL_SERVICE_ID_MAX) {
- error("IPC: unknown service (0x%x), aborting",
- msg->service_id);
- exit(EXIT_FAILURE);
+ error("IPC: unknown service (0x%x)", msg->service_id);
+ return false;
}
/* if service is registered */
if (!services[msg->service_id].handler) {
- error("IPC: unregistered service (0x%x), aborting",
- msg->service_id);
- exit(EXIT_FAILURE);
+ error("IPC: unregistered service (0x%x)", msg->service_id);
+ return false;
}
/* if opcode fit valid range */
if (msg->opcode < HAL_MINIMUM_EVENT) {
- error("IPC: invalid opcode for service 0x%x (0x%x), aborting",
+ error("IPC: invalid opcode for service 0x%x (0x%x)",
msg->service_id, msg->opcode);
- exit(EXIT_FAILURE);
+ return false;
}
/*
@@ -107,9 +105,9 @@ static void handle_msg(void *buf, ssize_t len)
/* if opcode is valid */
if (opcode >= services[msg->service_id].size) {
- error("IPC: invalid opcode for service 0x%x (0x%x), aborting",
+ error("IPC: invalid opcode for service 0x%x (0x%x)",
msg->service_id, msg->opcode);
- exit(EXIT_FAILURE);
+ return false;
}
handler = &services[msg->service_id].handler[opcode];
@@ -118,12 +116,14 @@ static void handle_msg(void *buf, ssize_t len)
if ((handler->var_len && handler->data_len > msg->len) ||
(!handler->var_len && handler->data_len != msg->len)) {
error("IPC: message size invalid for service 0x%x opcode 0x%x "
- "(%u bytes), aborting",
+ "(%u bytes)",
msg->service_id, msg->opcode, msg->len);
- exit(EXIT_FAILURE);
+ return false;
}
handler->handler(msg->payload, msg->len);
+
+ return true;
}
static void *notification_handler(void *data)
@@ -184,7 +184,8 @@ static void *notification_handler(void *data)
}
}
- handle_msg(buf, ret);
+ if (!handle_msg(buf, ret))
+ exit(EXIT_FAILURE);
}
close(notif_sk);