* [PATCH 02/10] android: Remove socket parameter from ipc_send_rsp
2013-11-28 14:15 [PATCH 01/10] android: Initialize IPC with command and notification sockets Szymon Janc
@ 2013-11-28 14:15 ` Szymon Janc
2013-11-28 14:15 ` [PATCH 03/10] android: Use ipc_send_rsp helper for replying success Szymon Janc
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Szymon Janc @ 2013-11-28 14:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
Use command socket provided to IPC on init.
---
android/a2dp.c | 2 +-
android/bluetooth.c | 2 +-
android/hidhost.c | 2 +-
android/ipc.c | 6 +++---
android/ipc.h | 2 +-
android/main.c | 17 ++++++-----------
android/pan.c | 2 +-
android/socket.c | 2 +-
8 files changed, 15 insertions(+), 20 deletions(-)
diff --git a/android/a2dp.c b/android/a2dp.c
index 2251001..14f34ad 100644
--- a/android/a2dp.c
+++ b/android/a2dp.c
@@ -251,7 +251,7 @@ void bt_a2dp_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
break;
}
- ipc_send_rsp(sk, HAL_SERVICE_ID_A2DP, opcode, status);
+ ipc_send_rsp(HAL_SERVICE_ID_A2DP, opcode, status);
}
static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
diff --git a/android/bluetooth.c b/android/bluetooth.c
index 0e45131..716c0eb 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -2269,7 +2269,7 @@ void bt_bluetooth_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
error:
error("Error handling command 0x%02x status %u", opcode, status);
- ipc_send_rsp(sk, HAL_SERVICE_ID_BLUETOOTH, opcode, status);
+ ipc_send_rsp(HAL_SERVICE_ID_BLUETOOTH, opcode, status);
}
bool bt_bluetooth_register(int sk)
diff --git a/android/hidhost.c b/android/hidhost.c
index d50c5b8..80957e8 100644
--- a/android/hidhost.c
+++ b/android/hidhost.c
@@ -1115,7 +1115,7 @@ void bt_hid_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
break;
}
- ipc_send_rsp(sk, HAL_SERVICE_ID_HIDHOST, opcode, status);
+ ipc_send_rsp(HAL_SERVICE_ID_HIDHOST, opcode, status);
}
static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
diff --git a/android/ipc.c b/android/ipc.c
index 028d4ad..51734e3 100644
--- a/android/ipc.c
+++ b/android/ipc.c
@@ -96,16 +96,16 @@ void ipc_send(int sk, uint8_t service_id, uint8_t opcode, uint16_t len,
}
}
-void ipc_send_rsp(int sk, uint8_t service_id, uint8_t opcode, uint8_t status)
+void ipc_send_rsp(uint8_t service_id, uint8_t opcode, uint8_t status)
{
struct hal_status s;
if (status == HAL_STATUS_SUCCESS) {
- ipc_send(sk, service_id, opcode, 0, NULL, -1);
+ ipc_send(cmd_sk, service_id, opcode, 0, NULL, -1);
return;
}
s.code = status;
- ipc_send(sk, service_id, HAL_OP_STATUS, sizeof(s), &s, -1);
+ ipc_send(cmd_sk, service_id, HAL_OP_STATUS, sizeof(s), &s, -1);
}
diff --git a/android/ipc.h b/android/ipc.h
index 5786d2d..873f715 100644
--- a/android/ipc.h
+++ b/android/ipc.h
@@ -26,4 +26,4 @@ void ipc_cleanup(void);
void ipc_send(int sk, uint8_t service_id, uint8_t opcode, uint16_t len,
void *param, int fd);
-void ipc_send_rsp(int sk, uint8_t service_id, uint8_t opcode, uint8_t status);
+void ipc_send_rsp(uint8_t service_id, uint8_t opcode, uint8_t status);
diff --git a/android/main.c b/android/main.c
index 4e6ad38..6fe0d1c 100644
--- a/android/main.c
+++ b/android/main.c
@@ -121,9 +121,8 @@ static void service_register(void *buf, uint16_t len)
info("Service ID=%u registered", m->service_id);
return;
failed:
- ipc_send_rsp(g_io_channel_unix_get_fd(hal_cmd_io),
- HAL_SERVICE_ID_CORE, HAL_OP_REGISTER_MODULE,
- HAL_STATUS_FAILED);
+ ipc_send_rsp(HAL_SERVICE_ID_CORE, HAL_OP_REGISTER_MODULE,
+ HAL_STATUS_FAILED);
}
static void service_unregister(void *buf, uint16_t len)
@@ -164,9 +163,8 @@ static void service_unregister(void *buf, uint16_t len)
info("Service ID=%u unregistered", m->service_id);
return;
failed:
- ipc_send_rsp(g_io_channel_unix_get_fd(hal_cmd_io),
- HAL_SERVICE_ID_CORE, HAL_OP_UNREGISTER_MODULE,
- HAL_STATUS_FAILED);
+ ipc_send_rsp(HAL_SERVICE_ID_CORE, HAL_OP_UNREGISTER_MODULE,
+ HAL_STATUS_FAILED);
}
static void handle_service_core(uint8_t opcode, void *buf, uint16_t len)
@@ -179,9 +177,7 @@ static void handle_service_core(uint8_t opcode, void *buf, uint16_t len)
service_unregister(buf, len);
break;
default:
- ipc_send_rsp(g_io_channel_unix_get_fd(hal_cmd_io),
- HAL_SERVICE_ID_CORE, opcode,
- HAL_STATUS_FAILED);
+ ipc_send_rsp(HAL_SERVICE_ID_CORE, opcode, HAL_STATUS_FAILED);
break;
}
}
@@ -277,8 +273,7 @@ static gboolean cmd_watch_cb(GIOChannel *io, GIOCondition cond,
bt_pan_handle_cmd(fd, msg->opcode, msg->payload, msg->len);
break;
default:
- ipc_send_rsp(fd, msg->service_id, msg->opcode,
- HAL_STATUS_FAILED);
+ ipc_send_rsp(msg->service_id, msg->opcode, HAL_STATUS_FAILED);
break;
}
diff --git a/android/pan.c b/android/pan.c
index ada458a..29f1007 100644
--- a/android/pan.c
+++ b/android/pan.c
@@ -88,7 +88,7 @@ void bt_pan_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
break;
}
- ipc_send_rsp(sk, HAL_SERVICE_ID_PAN, opcode, status);
+ ipc_send_rsp(HAL_SERVICE_ID_PAN, opcode, status);
}
bool bt_pan_register(int sk, const bdaddr_t *addr)
diff --git a/android/socket.c b/android/socket.c
index 1fb154d..c2212d9 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -931,7 +931,7 @@ void bt_sock_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
break;
}
- ipc_send_rsp(sk, HAL_SERVICE_ID_SOCK, opcode, HAL_STATUS_FAILED);
+ ipc_send_rsp(HAL_SERVICE_ID_SOCK, opcode, HAL_STATUS_FAILED);
}
bool bt_socket_register(int sk, const bdaddr_t *addr)
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 03/10] android: Use ipc_send_rsp helper for replying success
2013-11-28 14:15 [PATCH 01/10] android: Initialize IPC with command and notification sockets Szymon Janc
2013-11-28 14:15 ` [PATCH 02/10] android: Remove socket parameter from ipc_send_rsp Szymon Janc
@ 2013-11-28 14:15 ` Szymon Janc
2013-11-28 14:15 ` [PATCH 04/10] android: Add IPC helper for sending notifications Szymon Janc
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Szymon Janc @ 2013-11-28 14:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
Where applicable use helper as this make code easier to understand.
---
android/bluetooth.c | 2 +-
android/main.c | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/android/bluetooth.c b/android/bluetooth.c
index 716c0eb..b5fd644 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -2263,7 +2263,7 @@ void bt_bluetooth_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
goto error;
}
- ipc_send(sk, HAL_SERVICE_ID_BLUETOOTH, opcode, 0, NULL, -1);
+ ipc_send_rsp(HAL_SERVICE_ID_BLUETOOTH, opcode, HAL_STATUS_SUCCESS);
return;
error:
diff --git a/android/main.c b/android/main.c
index 6fe0d1c..211503b 100644
--- a/android/main.c
+++ b/android/main.c
@@ -115,8 +115,8 @@ static void service_register(void *buf, uint16_t len)
services[m->service_id] = true;
- ipc_send(g_io_channel_unix_get_fd(hal_cmd_io), HAL_SERVICE_ID_CORE,
- HAL_OP_REGISTER_MODULE, 0, NULL, -1);
+ ipc_send_rsp(HAL_SERVICE_ID_CORE, HAL_OP_REGISTER_MODULE,
+ HAL_STATUS_SUCCESS);
info("Service ID=%u registered", m->service_id);
return;
@@ -157,8 +157,8 @@ static void service_unregister(void *buf, uint16_t len)
services[m->service_id] = false;
- ipc_send(g_io_channel_unix_get_fd(hal_cmd_io), HAL_SERVICE_ID_CORE,
- HAL_OP_UNREGISTER_MODULE, 0, NULL, -1);
+ ipc_send_rsp(HAL_SERVICE_ID_CORE, HAL_OP_UNREGISTER_MODULE,
+ HAL_STATUS_SUCCESS);
info("Service ID=%u unregistered", m->service_id);
return;
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 04/10] android: Add IPC helper for sending notifications
2013-11-28 14:15 [PATCH 01/10] android: Initialize IPC with command and notification sockets Szymon Janc
2013-11-28 14:15 ` [PATCH 02/10] android: Remove socket parameter from ipc_send_rsp Szymon Janc
2013-11-28 14:15 ` [PATCH 03/10] android: Use ipc_send_rsp helper for replying success Szymon Janc
@ 2013-11-28 14:15 ` Szymon Janc
2013-11-28 14:15 ` [PATCH 05/10] android: Use ipc_send_notif " Szymon Janc
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Szymon Janc @ 2013-11-28 14:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
This will use notification socket passed on IPC init.
---
android/ipc.c | 9 +++++++++
android/ipc.h | 2 ++
2 files changed, 11 insertions(+)
diff --git a/android/ipc.c b/android/ipc.c
index 51734e3..d1a59d7 100644
--- a/android/ipc.c
+++ b/android/ipc.c
@@ -109,3 +109,12 @@ void ipc_send_rsp(uint8_t service_id, uint8_t opcode, uint8_t status)
ipc_send(cmd_sk, service_id, HAL_OP_STATUS, sizeof(s), &s, -1);
}
+
+void ipc_send_notif(uint8_t service_id, uint8_t opcode, uint16_t len,
+ void *param)
+{
+ if (notif_sk < 0)
+ return;
+
+ ipc_send(notif_sk, service_id, opcode, len, param, -1);
+}
diff --git a/android/ipc.h b/android/ipc.h
index 873f715..1233bec 100644
--- a/android/ipc.h
+++ b/android/ipc.h
@@ -27,3 +27,5 @@ void ipc_cleanup(void);
void ipc_send(int sk, uint8_t service_id, uint8_t opcode, uint16_t len,
void *param, int fd);
void ipc_send_rsp(uint8_t service_id, uint8_t opcode, uint8_t status);
+void ipc_send_notif(uint8_t service_id, uint8_t opcode, uint16_t len,
+ void *param);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 05/10] android: Use ipc_send_notif for sending notifications
2013-11-28 14:15 [PATCH 01/10] android: Initialize IPC with command and notification sockets Szymon Janc
` (2 preceding siblings ...)
2013-11-28 14:15 ` [PATCH 04/10] android: Add IPC helper for sending notifications Szymon Janc
@ 2013-11-28 14:15 ` Szymon Janc
2013-11-28 14:15 ` [PATCH 06/10] android: Add ipc_send_rsp_full IPC helper Szymon Janc
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Szymon Janc @ 2013-11-28 14:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
---
android/a2dp.c | 4 ++--
android/bluetooth.c | 63 ++++++++++++++++++++++++++---------------------------
android/hidhost.c | 20 ++++++++---------
3 files changed, 43 insertions(+), 44 deletions(-)
diff --git a/android/a2dp.c b/android/a2dp.c
index 14f34ad..92c359e 100644
--- a/android/a2dp.c
+++ b/android/a2dp.c
@@ -112,8 +112,8 @@ static void bt_a2dp_notify_state(struct a2dp_device *dev, uint8_t state)
bdaddr2android(&dev->dst, ev.bdaddr);
ev.state = state;
- ipc_send(notification_sk, HAL_SERVICE_ID_A2DP,
- HAL_EV_A2DP_CONN_STATE, sizeof(ev), &ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_A2DP, HAL_EV_A2DP_CONN_STATE, sizeof(ev),
+ &ev);
if (state != HAL_A2DP_STATE_DISCONNECTED)
return;
diff --git a/android/bluetooth.c b/android/bluetooth.c
index b5fd644..68e26fa 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -132,8 +132,8 @@ static void adapter_name_changed(const uint8_t *name)
ev->props[0].len = len;
memcpy(ev->props->val, name, len);
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_ADAPTER_PROPS_CHANGED, sizeof(buf), ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_ADAPTER_PROPS_CHANGED,
+ sizeof(buf), ev);
}
static void adapter_set_name(const uint8_t *name)
@@ -173,8 +173,8 @@ static void powered_changed(void)
DBG("%u", ev.state);
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_ADAPTER_STATE_CHANGED, sizeof(ev), &ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_ADAPTER_STATE_CHANGED,
+ sizeof(ev), &ev);
}
static uint8_t settings2scan_mode(void)
@@ -210,8 +210,8 @@ static void scan_mode_changed(void)
DBG("mode %u", *mode);
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_ADAPTER_PROPS_CHANGED, sizeof(buf), buf, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_ADAPTER_PROPS_CHANGED,
+ sizeof(buf), buf);
}
static void adapter_class_changed(void)
@@ -226,8 +226,8 @@ static void adapter_class_changed(void)
ev->props[0].len = sizeof(uint32_t);
memcpy(ev->props->val, &adapter.dev_class, sizeof(uint32_t));
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_ADAPTER_PROPS_CHANGED, sizeof(buf), buf, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_ADAPTER_PROPS_CHANGED,
+ sizeof(buf), buf);
}
static void settings_changed(uint32_t settings)
@@ -327,8 +327,8 @@ static void send_bond_state_change(const bdaddr_t *addr, uint8_t status,
ev.state = state;
bdaddr2android(addr, ev.bdaddr);
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_BOND_STATE_CHANGED, sizeof(ev), &ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_BOND_STATE_CHANGED,
+ sizeof(ev), &ev);
}
static void cache_device_name(const bdaddr_t *addr, const char *name)
@@ -408,8 +408,8 @@ static void remote_uuids_callback(struct browse_req *req)
ev->props[0].len = sizeof(uint128_t) * g_slist_length(req->uuids);
fill_uuids(req->uuids, ev->props[0].val);
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_REMOTE_DEVICE_PROPS, len, ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_REMOTE_DEVICE_PROPS,
+ len, ev);
g_free(ev);
}
@@ -605,8 +605,8 @@ static void send_remote_device_name_prop(const bdaddr_t *bdaddr)
ev->props[0].len = strlen(name);
memcpy(&ev->props[0].val, name, strlen(name));
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_REMOTE_DEVICE_PROPS, ev_len, ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_REMOTE_DEVICE_PROPS,
+ ev_len, ev);
g_free(ev);
}
@@ -639,8 +639,8 @@ static void pin_code_request_callback(uint16_t index, uint16_t length,
memset(&hal_ev, 0, sizeof(hal_ev));
bdaddr2android(&ev->addr.bdaddr, hal_ev.bdaddr);
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH, HAL_EV_PIN_REQUEST,
- sizeof(hal_ev), &hal_ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_PIN_REQUEST,
+ sizeof(hal_ev), &hal_ev);
}
static void send_ssp_request(const bdaddr_t *addr, uint8_t variant,
@@ -657,8 +657,8 @@ static void send_ssp_request(const bdaddr_t *addr, uint8_t variant,
ev.pairing_variant = variant;
ev.passkey = passkey;
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH, HAL_EV_SSP_REQUEST,
- sizeof(ev), &ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_SSP_REQUEST,
+ sizeof(ev), &ev);
}
static void user_confirm_request_callback(uint16_t index, uint16_t length,
@@ -760,8 +760,8 @@ static void mgmt_discovering_event(uint16_t index, uint16_t length,
cp.state = HAL_DISCOVERY_STATE_STOPPED;
}
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_DISCOVERY_STATE_CHANGED, sizeof(cp), &cp, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH,
+ HAL_EV_DISCOVERY_STATE_CHANGED, sizeof(cp), &cp);
}
static void confirm_device_name(const bdaddr_t *addr, uint8_t addr_type)
@@ -872,8 +872,7 @@ static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,
(*num_prop)++;
}
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH, opcode, size, buf,
- -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, opcode, size, buf);
if (confirm) {
char addr[18];
@@ -943,8 +942,8 @@ static void mgmt_device_connected_event(uint16_t index, uint16_t length,
hal_ev.state = HAL_ACL_STATE_CONNECTED;
bdaddr2android(&ev->addr.bdaddr, hal_ev.bdaddr);
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_ACL_STATE_CHANGED, sizeof(hal_ev), &hal_ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_ACL_STATE_CHANGED,
+ sizeof(hal_ev), &hal_ev);
}
static void mgmt_device_disconnected_event(uint16_t index, uint16_t length,
@@ -962,8 +961,8 @@ static void mgmt_device_disconnected_event(uint16_t index, uint16_t length,
hal_ev.state = HAL_ACL_STATE_DISCONNECTED;
bdaddr2android(&ev->addr.bdaddr, hal_ev.bdaddr);
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_ACL_STATE_CHANGED, sizeof(hal_ev), &hal_ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_ACL_STATE_CHANGED,
+ sizeof(hal_ev), &hal_ev);
}
static uint8_t status_mgmt2hal(uint8_t mgmt)
@@ -1169,8 +1168,8 @@ static bool get_uuids(void)
p += sizeof(uint128_t);
}
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_ADAPTER_PROPS_CHANGED, sizeof(buf), ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_ADAPTER_PROPS_CHANGED,
+ sizeof(buf), ev);
return true;
}
@@ -1701,8 +1700,8 @@ static void get_address(void)
ev->props[0].len = sizeof(bdaddr_t);
bdaddr2android(&adapter.bdaddr, ev->props[0].val);
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_ADAPTER_PROPS_CHANGED, sizeof(buf), buf, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_ADAPTER_PROPS_CHANGED,
+ sizeof(buf), buf);
}
static bool get_name(void)
@@ -1777,8 +1776,8 @@ static bool get_discoverable_timeout(void)
memcpy(&ev->props[0].val, &adapter.discoverable_timeout,
sizeof(uint32_t));
- ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
- HAL_EV_ADAPTER_PROPS_CHANGED, sizeof(buf), ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_BLUETOOTH, HAL_EV_ADAPTER_PROPS_CHANGED,
+ sizeof(buf), ev);
return true;
}
diff --git a/android/hidhost.c b/android/hidhost.c
index 80957e8..09c71f4 100644
--- a/android/hidhost.c
+++ b/android/hidhost.c
@@ -297,8 +297,8 @@ static void bt_hid_notify_state(struct hid_device *dev, uint8_t state)
bdaddr2android(&dev->dst, ev.bdaddr);
ev.state = state;
- ipc_send(notification_sk, HAL_SERVICE_ID_HIDHOST,
- HAL_EV_HIDHOST_CONN_STATE, sizeof(ev), &ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_HIDHOST, HAL_EV_HIDHOST_CONN_STATE,
+ sizeof(ev), &ev);
}
static gboolean intr_watch_cb(GIOChannel *chan, GIOCondition cond,
@@ -356,8 +356,8 @@ static void bt_hid_notify_proto_mode(struct hid_device *dev, uint8_t *buf,
ev.mode = HAL_HIDHOST_UNSUPPORTED_PROTOCOL;
}
- ipc_send(notification_sk, HAL_SERVICE_ID_HIDHOST,
- HAL_EV_HIDHOST_PROTO_MODE, sizeof(ev), &ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_HIDHOST, HAL_EV_HIDHOST_PROTO_MODE,
+ sizeof(ev), &ev);
}
static void bt_hid_notify_get_report(struct hid_device *dev, uint8_t *buf,
@@ -399,8 +399,8 @@ static void bt_hid_notify_get_report(struct hid_device *dev, uint8_t *buf,
}
send:
- ipc_send(notification_sk, HAL_SERVICE_ID_HIDHOST,
- HAL_EV_HIDHOST_GET_REPORT, ev_len, ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_HIDHOST, HAL_EV_HIDHOST_GET_REPORT,
+ ev_len, ev);
g_free(ev);
}
@@ -424,8 +424,8 @@ static void bt_hid_notify_virtual_unplug(struct hid_device *dev,
ev.status = HAL_HIDHOST_STATUS_OK;
}
- ipc_send(notification_sk, HAL_SERVICE_ID_HIDHOST,
- HAL_EV_HIDHOST_VIRTUAL_UNPLUG, sizeof(ev), &ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_HIDHOST, HAL_EV_HIDHOST_VIRTUAL_UNPLUG,
+ sizeof(ev), &ev);
}
@@ -509,8 +509,8 @@ static void bt_hid_set_info(struct hid_device *dev)
memset(ev.descr, 0, sizeof(ev.descr));
memcpy(ev.descr, dev->rd_data, ev.descr_len);
- ipc_send(notification_sk, HAL_SERVICE_ID_HIDHOST, HAL_EV_HIDHOST_INFO,
- sizeof(ev), &ev, -1);
+ ipc_send_notif(HAL_SERVICE_ID_HIDHOST, HAL_EV_HIDHOST_INFO, sizeof(ev),
+ &ev);
}
static int uhid_create(struct hid_device *dev)
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 06/10] android: Add ipc_send_rsp_full IPC helper
2013-11-28 14:15 [PATCH 01/10] android: Initialize IPC with command and notification sockets Szymon Janc
` (3 preceding siblings ...)
2013-11-28 14:15 ` [PATCH 05/10] android: Use ipc_send_notif " Szymon Janc
@ 2013-11-28 14:15 ` Szymon Janc
2013-11-28 14:15 ` [PATCH 07/10] android/socket: Use " Szymon Janc
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Szymon Janc @ 2013-11-28 14:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
This will be used to send non-empty reply using command socket.
---
android/ipc.c | 6 ++++++
android/ipc.h | 2 ++
2 files changed, 8 insertions(+)
diff --git a/android/ipc.c b/android/ipc.c
index d1a59d7..83c2221 100644
--- a/android/ipc.c
+++ b/android/ipc.c
@@ -110,6 +110,12 @@ void ipc_send_rsp(uint8_t service_id, uint8_t opcode, uint8_t status)
ipc_send(cmd_sk, service_id, HAL_OP_STATUS, sizeof(s), &s, -1);
}
+void ipc_send_rsp_full(uint8_t service_id, uint8_t opcode, uint16_t len,
+ void *param, int fd)
+{
+ ipc_send(cmd_sk, service_id, opcode, len, param, fd);
+}
+
void ipc_send_notif(uint8_t service_id, uint8_t opcode, uint16_t len,
void *param)
{
diff --git a/android/ipc.h b/android/ipc.h
index 1233bec..ce0e0b1 100644
--- a/android/ipc.h
+++ b/android/ipc.h
@@ -27,5 +27,7 @@ void ipc_cleanup(void);
void ipc_send(int sk, uint8_t service_id, uint8_t opcode, uint16_t len,
void *param, int fd);
void ipc_send_rsp(uint8_t service_id, uint8_t opcode, uint8_t status);
+void ipc_send_rsp_full(uint8_t service_id, uint8_t opcode, uint16_t len,
+ void *param, int fd);
void ipc_send_notif(uint8_t service_id, uint8_t opcode, uint16_t len,
void *param);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 07/10] android/socket: Use ipc_send_rsp_full IPC helper
2013-11-28 14:15 [PATCH 01/10] android: Initialize IPC with command and notification sockets Szymon Janc
` (4 preceding siblings ...)
2013-11-28 14:15 ` [PATCH 06/10] android: Add ipc_send_rsp_full IPC helper Szymon Janc
@ 2013-11-28 14:15 ` Szymon Janc
2013-11-28 14:15 ` [PATCH 08/10] android: Make ipc_send static Szymon Janc
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Szymon Janc @ 2013-11-28 14:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
Use command reply helper for sending reply with file descriptor.
---
android/socket.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/android/socket.c b/android/socket.c
index c2212d9..6a5f4e8 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -909,7 +909,7 @@ void bt_sock_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
if (fd < 0)
break;
- ipc_send(sk, HAL_SERVICE_ID_SOCK, opcode, 0, NULL, fd);
+ ipc_send_rsp_full(HAL_SERVICE_ID_SOCK, opcode, 0, NULL, fd);
if (close(fd) < 0)
error("close() fd %d failed: %s", fd, strerror(errno));
@@ -920,7 +920,7 @@ void bt_sock_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
if (fd < 0)
break;
- ipc_send(sk, HAL_SERVICE_ID_SOCK, opcode, 0, NULL, fd);
+ ipc_send_rsp_full(HAL_SERVICE_ID_SOCK, opcode, 0, NULL, fd);
if (close(fd) < 0)
error("close() fd %d failed: %s", fd, strerror(errno));
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 08/10] android: Make ipc_send static
2013-11-28 14:15 [PATCH 01/10] android: Initialize IPC with command and notification sockets Szymon Janc
` (5 preceding siblings ...)
2013-11-28 14:15 ` [PATCH 07/10] android/socket: Use " Szymon Janc
@ 2013-11-28 14:15 ` Szymon Janc
2013-11-28 14:15 ` [PATCH 09/10] android/bluetooth: Remove not needed notification_sk checks Szymon Janc
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Szymon Janc @ 2013-11-28 14:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
It should not longer be used from outside of IPC code.
---
android/ipc.c | 2 +-
android/ipc.h | 2 --
2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/android/ipc.c b/android/ipc.c
index 83c2221..64b0db5 100644
--- a/android/ipc.c
+++ b/android/ipc.c
@@ -51,7 +51,7 @@ void ipc_cleanup(void)
notif_sk = -1;
}
-void ipc_send(int sk, uint8_t service_id, uint8_t opcode, uint16_t len,
+static void ipc_send(int sk, uint8_t service_id, uint8_t opcode, uint16_t len,
void *param, int fd)
{
struct msghdr msg;
diff --git a/android/ipc.h b/android/ipc.h
index ce0e0b1..f66c9e0 100644
--- a/android/ipc.h
+++ b/android/ipc.h
@@ -24,8 +24,6 @@
void ipc_init(int command_sk, int notification_sk);
void ipc_cleanup(void);
-void ipc_send(int sk, uint8_t service_id, uint8_t opcode, uint16_t len,
- void *param, int fd);
void ipc_send_rsp(uint8_t service_id, uint8_t opcode, uint8_t status);
void ipc_send_rsp_full(uint8_t service_id, uint8_t opcode, uint16_t len,
void *param, int fd);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 09/10] android/bluetooth: Remove not needed notification_sk checks
2013-11-28 14:15 [PATCH 01/10] android: Initialize IPC with command and notification sockets Szymon Janc
` (6 preceding siblings ...)
2013-11-28 14:15 ` [PATCH 08/10] android: Make ipc_send static Szymon Janc
@ 2013-11-28 14:15 ` Szymon Janc
2013-11-28 14:15 ` [PATCH 10/10] android: Don't pass notification socket on services register Szymon Janc
2013-11-28 16:06 ` [PATCH 01/10] android: Initialize IPC with command and notification sockets Luiz Augusto von Dentz
9 siblings, 0 replies; 11+ messages in thread
From: Szymon Janc @ 2013-11-28 14:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
This is now checked inside ipc_send_notif helper.
---
android/bluetooth.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/android/bluetooth.c b/android/bluetooth.c
index 68e26fa..fdafb81 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -1185,9 +1185,7 @@ static void remove_uuid_complete(uint8_t status, uint16_t length,
mgmt_dev_class_changed_event(adapter.index, length, param, NULL);
- /* send notification only if bluetooth service is registered */
- if (notification_sk >= 0)
- get_uuids();
+ get_uuids();
}
static void remove_uuid(uint16_t uuid)
@@ -1213,9 +1211,7 @@ static void add_uuid_complete(uint8_t status, uint16_t length,
mgmt_dev_class_changed_event(adapter.index, length, param, NULL);
- /* send notification only if bluetooth service is registered */
- if (notification_sk >= 0)
- get_uuids();
+ get_uuids();
}
static void add_uuid(uint8_t svc_hint, uint16_t uuid)
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 10/10] android: Don't pass notification socket on services register
2013-11-28 14:15 [PATCH 01/10] android: Initialize IPC with command and notification sockets Szymon Janc
` (7 preceding siblings ...)
2013-11-28 14:15 ` [PATCH 09/10] android/bluetooth: Remove not needed notification_sk checks Szymon Janc
@ 2013-11-28 14:15 ` Szymon Janc
2013-11-28 16:06 ` [PATCH 01/10] android: Initialize IPC with command and notification sockets Luiz Augusto von Dentz
9 siblings, 0 replies; 11+ messages in thread
From: Szymon Janc @ 2013-11-28 14:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
It is no longer needed as proper socket is use by IPC helpers.
---
android/a2dp.c | 13 +------------
android/a2dp.h | 2 +-
android/bluetooth.c | 16 +---------------
android/bluetooth.h | 2 +-
android/hidhost.c | 12 +-----------
android/hidhost.h | 2 +-
android/main.c | 13 +++++--------
android/pan.c | 14 +-------------
android/pan.h | 2 +-
android/socket.c | 4 +---
android/socket.h | 2 +-
11 files changed, 15 insertions(+), 67 deletions(-)
diff --git a/android/a2dp.c b/android/a2dp.c
index 92c359e..99aa14d 100644
--- a/android/a2dp.c
+++ b/android/a2dp.c
@@ -48,7 +48,6 @@
#define L2CAP_PSM_AVDTP 0x19
#define SVC_HINT_CAPTURING 0x08
-static int notification_sk = -1;
static GIOChannel *server = NULL;
static GSList *devices = NULL;
static bdaddr_t adapter_addr;
@@ -350,16 +349,13 @@ static sdp_record_t *a2dp_record(void)
return record;
}
-bool bt_a2dp_register(int sk, const bdaddr_t *addr)
+bool bt_a2dp_register(const bdaddr_t *addr)
{
GError *err = NULL;
sdp_record_t *rec;
DBG("");
- if (notification_sk >= 0)
- return false;
-
bacpy(&adapter_addr, addr);
server = bt_io_listen(connect_cb, NULL, NULL, NULL, &err,
@@ -384,8 +380,6 @@ bool bt_a2dp_register(int sk, const bdaddr_t *addr)
}
record_id = rec->handle;
- notification_sk = sk;
-
return true;
}
@@ -400,14 +394,9 @@ void bt_a2dp_unregister(void)
{
DBG("");
- if (notification_sk < 0)
- return;
-
g_slist_foreach(devices, a2dp_device_disconnected, NULL);
devices = NULL;
- notification_sk = -1;
-
bt_adapter_remove_record(record_id);
record_id = 0;
diff --git a/android/a2dp.h b/android/a2dp.h
index 3531618..2a1eb3c 100644
--- a/android/a2dp.h
+++ b/android/a2dp.h
@@ -23,5 +23,5 @@
void bt_a2dp_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len);
-bool bt_a2dp_register(int sk, const bdaddr_t *addr);
+bool bt_a2dp_register(const bdaddr_t *addr);
void bt_a2dp_unregister(void);
diff --git a/android/bluetooth.c b/android/bluetooth.c
index fdafb81..8a1d444 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -60,8 +60,6 @@
static uint16_t option_index = MGMT_INDEX_NONE;
-static int notification_sk = -1;
-
#define BASELEN_REMOTE_DEV_PROP (sizeof(struct hal_ev_remote_device_props) \
+ sizeof(struct hal_property))
/* This list contains addresses which are asked for records */
@@ -2267,24 +2265,12 @@ error:
ipc_send_rsp(HAL_SERVICE_ID_BLUETOOTH, opcode, status);
}
-bool bt_bluetooth_register(int sk)
+void bt_bluetooth_register(void)
{
DBG("");
-
- if (notification_sk >= 0)
- return false;
-
- notification_sk = sk;
-
- return true;
}
void bt_bluetooth_unregister(void)
{
DBG("");
-
- if (notification_sk < 0)
- return;
-
- notification_sk = -1;
}
diff --git a/android/bluetooth.h b/android/bluetooth.h
index 44b8e9e..86872ee 100644
--- a/android/bluetooth.h
+++ b/android/bluetooth.h
@@ -31,7 +31,7 @@ void bt_bluetooth_cleanup(void);
void bt_bluetooth_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len);
-bool bt_bluetooth_register(int sk);
+void bt_bluetooth_register(void);
void bt_bluetooth_unregister(void);
int bt_adapter_add_record(sdp_record_t *rec, uint8_t svc_hint);
diff --git a/android/hidhost.c b/android/hidhost.c
index 09c71f4..50ac50d 100644
--- a/android/hidhost.c
+++ b/android/hidhost.c
@@ -78,7 +78,6 @@
static bdaddr_t adapter_addr;
-static int notification_sk = -1;
static GIOChannel *ctrl_io = NULL;
static GIOChannel *intr_io = NULL;
static GSList *devices = NULL;
@@ -1190,15 +1189,12 @@ static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
}
}
-bool bt_hid_register(int sk, const bdaddr_t *addr)
+bool bt_hid_register(const bdaddr_t *addr)
{
GError *err = NULL;
DBG("");
- if (notification_sk >= 0)
- return false;
-
bacpy(&adapter_addr, addr);
ctrl_io = bt_io_listen(connect_cb, NULL, NULL, NULL, &err,
@@ -1224,8 +1220,6 @@ bool bt_hid_register(int sk, const bdaddr_t *addr)
return false;
}
- notification_sk = sk;
-
return true;
}
@@ -1241,12 +1235,8 @@ void bt_hid_unregister(void)
{
DBG("");
- if (notification_sk < 0)
- return;
-
g_slist_foreach(devices, free_hid_devices, NULL);
devices = NULL;
- notification_sk = -1;
if (ctrl_io) {
g_io_channel_shutdown(ctrl_io, TRUE, NULL);
diff --git a/android/hidhost.h b/android/hidhost.h
index 688086a..b5545fb 100644
--- a/android/hidhost.h
+++ b/android/hidhost.h
@@ -23,5 +23,5 @@
void bt_hid_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len);
-bool bt_hid_register(int sk, const bdaddr_t *addr);
+bool bt_hid_register(const bdaddr_t *addr);
void bt_hid_unregister(void);
diff --git a/android/main.c b/android/main.c
index 211503b..fb16503 100644
--- a/android/main.c
+++ b/android/main.c
@@ -77,34 +77,31 @@ static bool services[HAL_SERVICE_ID_MAX + 1] = { false };
static void service_register(void *buf, uint16_t len)
{
struct hal_cmd_register_module *m = buf;
- int sk = g_io_channel_unix_get_fd(hal_notif_io);
if (m->service_id > HAL_SERVICE_ID_MAX || services[m->service_id])
goto failed;
switch (m->service_id) {
case HAL_SERVICE_ID_BLUETOOTH:
- if (!bt_bluetooth_register(sk))
- goto failed;
+ bt_bluetooth_register();
break;
case HAL_SERVICE_ID_SOCK:
- if (!bt_socket_register(sk, &adapter_bdaddr))
- goto failed;
+ bt_socket_register(&adapter_bdaddr);
break;
case HAL_SERVICE_ID_HIDHOST:
- if (!bt_hid_register(sk, &adapter_bdaddr))
+ if (!bt_hid_register(&adapter_bdaddr))
goto failed;
break;
case HAL_SERVICE_ID_A2DP:
- if (!bt_a2dp_register(sk, &adapter_bdaddr))
+ if (!bt_a2dp_register(&adapter_bdaddr))
goto failed;
break;
case HAL_SERVICE_ID_PAN:
- if (!bt_pan_register(sk, &adapter_bdaddr))
+ if (!bt_pan_register(&adapter_bdaddr))
goto failed;
break;
diff --git a/android/pan.c b/android/pan.c
index 29f1007..ea15637 100644
--- a/android/pan.c
+++ b/android/pan.c
@@ -35,8 +35,6 @@
#include "hal-msg.h"
#include "ipc.h"
-static int notification_sk = -1;
-
static uint8_t bt_pan_enable(struct hal_cmd_pan_enable *cmd, uint16_t len)
{
DBG("Not Implemented");
@@ -91,24 +89,14 @@ void bt_pan_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
ipc_send_rsp(HAL_SERVICE_ID_PAN, opcode, status);
}
-bool bt_pan_register(int sk, const bdaddr_t *addr)
+bool bt_pan_register(const bdaddr_t *addr)
{
DBG("");
- if (notification_sk >= 0)
- return false;
-
- notification_sk = sk;
-
return true;
}
void bt_pan_unregister(void)
{
DBG("");
-
- if (notification_sk < 0)
- return;
-
- notification_sk = -1;
}
diff --git a/android/pan.h b/android/pan.h
index 2430378..dd18f68 100644
--- a/android/pan.h
+++ b/android/pan.h
@@ -23,5 +23,5 @@
void bt_pan_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len);
-bool bt_pan_register(int sk, const bdaddr_t *addr);
+bool bt_pan_register(const bdaddr_t *addr);
void bt_pan_unregister(void);
diff --git a/android/socket.c b/android/socket.c
index 6a5f4e8..4550dc8 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -934,13 +934,11 @@ void bt_sock_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
ipc_send_rsp(HAL_SERVICE_ID_SOCK, opcode, HAL_STATUS_FAILED);
}
-bool bt_socket_register(int sk, const bdaddr_t *addr)
+void bt_socket_register(const bdaddr_t *addr)
{
DBG("");
bacpy(&adapter_addr, addr);
-
- return true;
}
void bt_socket_unregister(void)
diff --git a/android/socket.h b/android/socket.h
index ba56c9b..5150b89 100644
--- a/android/socket.h
+++ b/android/socket.h
@@ -30,5 +30,5 @@ struct hal_sock_connect_signal {
void bt_sock_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len);
-bool bt_socket_register(int sk, const bdaddr_t *addr);
+void bt_socket_register(const bdaddr_t *addr);
void bt_socket_unregister(void);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH 01/10] android: Initialize IPC with command and notification sockets
2013-11-28 14:15 [PATCH 01/10] android: Initialize IPC with command and notification sockets Szymon Janc
` (8 preceding siblings ...)
2013-11-28 14:15 ` [PATCH 10/10] android: Don't pass notification socket on services register Szymon Janc
@ 2013-11-28 16:06 ` Luiz Augusto von Dentz
9 siblings, 0 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2013-11-28 16:06 UTC (permalink / raw)
To: Szymon Janc; +Cc: linux-bluetooth@vger.kernel.org
Hi Szymon,
On Thu, Nov 28, 2013 at 4:15 PM, Szymon Janc <szymon.janc@tieto.com> wrote:
> Pass sockets after succesfully connected to HAL. This will allow
> to improve IPC helpers API.
> ---
> android/ipc.c | 15 +++++++++++++++
> android/ipc.h | 3 +++
> android/main.c | 5 +++++
> 3 files changed, 23 insertions(+)
>
> diff --git a/android/ipc.c b/android/ipc.c
> index 25c36fd..028d4ad 100644
> --- a/android/ipc.c
> +++ b/android/ipc.c
> @@ -36,6 +36,21 @@
> #include "ipc.h"
> #include "log.h"
>
> +static int cmd_sk = -1;
> +static int notif_sk = -1;
> +
> +void ipc_init(int command_sk, int notification_sk)
> +{
> + cmd_sk = command_sk;
> + notif_sk = notification_sk;
> +}
> +
> +void ipc_cleanup(void)
> +{
> + cmd_sk = -1;
> + notif_sk = -1;
> +}
> +
> void ipc_send(int sk, uint8_t service_id, uint8_t opcode, uint16_t len,
> void *param, int fd)
> {
> diff --git a/android/ipc.h b/android/ipc.h
> index ad4a2d2..5786d2d 100644
> --- a/android/ipc.h
> +++ b/android/ipc.h
> @@ -21,6 +21,9 @@
> *
> */
>
> +void ipc_init(int command_sk, int notification_sk);
> +void ipc_cleanup(void);
> +
> void ipc_send(int sk, uint8_t service_id, uint8_t opcode, uint16_t len,
> void *param, int fd);
> void ipc_send_rsp(int sk, uint8_t service_id, uint8_t opcode, uint8_t status);
> diff --git a/android/main.c b/android/main.c
> index bfd2a87..4e6ad38 100644
> --- a/android/main.c
> +++ b/android/main.c
> @@ -354,6 +354,9 @@ static gboolean notif_connect_cb(GIOChannel *io, GIOCondition cond,
>
> g_io_add_watch(hal_cmd_io, cond, cmd_watch_cb, NULL);
>
> + ipc_init(g_io_channel_unix_get_fd(hal_cmd_io),
> + g_io_channel_unix_get_fd(hal_notif_io));
> +
> info("Successfully connected to HAL");
>
> return FALSE;
> @@ -494,6 +497,8 @@ static void cleanup_hal_connection(void)
> g_io_channel_unref(hal_notif_io);
> hal_notif_io = NULL;
> }
> +
> + ipc_cleanup();
> }
>
> static bool set_capabilities(void)
> --
> 1.8.3.2
Applied, thanks.
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 11+ messages in thread