mirror of
https://salsa.debian.org/ha-team/libqb
synced 2026-01-21 12:36:54 +00:00
call recv_ready on socket types
Signed-off-by: Angus Salkeld <asalkeld@redhat.com>
This commit is contained in:
parent
d80f218133
commit
b650bf29d6
48
lib/ipcc.c
48
lib/ipcc.c
@ -100,6 +100,30 @@ disconnect_and_cleanup:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct qb_ipc_one_way *
|
||||
_event_sock_one_way_get(struct qb_ipcc_connection * c)
|
||||
{
|
||||
if (c->needs_sock_for_poll) {
|
||||
return &c->setup;
|
||||
}
|
||||
if (c->event.type == QB_IPC_SOCKET) {
|
||||
return &c->event;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct qb_ipc_one_way *
|
||||
_response_sock_one_way_get(struct qb_ipcc_connection * c)
|
||||
{
|
||||
if (c->needs_sock_for_poll) {
|
||||
return &c->setup;
|
||||
}
|
||||
if (c->response.type == QB_IPC_SOCKET) {
|
||||
return &c->response;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ssize_t
|
||||
qb_ipcc_send(struct qb_ipcc_connection * c, const void *msg_ptr, size_t msg_len)
|
||||
{
|
||||
@ -204,8 +228,12 @@ qb_ipcc_recv(struct qb_ipcc_connection * c, void *msg_ptr,
|
||||
}
|
||||
|
||||
res = c->funcs.recv(&c->response, msg_ptr, msg_len, ms_timeout);
|
||||
if ((res == -EAGAIN || res == -ETIMEDOUT) && c->needs_sock_for_poll) {
|
||||
res2 = qb_ipc_us_recv_ready(&c->setup, 0);
|
||||
if (res == -EAGAIN || res == -ETIMEDOUT) {
|
||||
struct qb_ipc_one_way *ow = _response_sock_one_way_get(c);
|
||||
|
||||
if (ow == NULL) return res;
|
||||
|
||||
res2 = qb_ipc_us_recv_ready(ow, 0);
|
||||
if (res2 < 0) {
|
||||
if (res2 == -ENOTCONN) {
|
||||
c->is_connected = QB_FALSE;
|
||||
@ -303,12 +331,7 @@ qb_ipcc_event_recv(struct qb_ipcc_connection * c, void *msg_pt,
|
||||
if (c == NULL) {
|
||||
return -EINVAL;
|
||||
}
|
||||
if (c->needs_sock_for_poll) {
|
||||
ow = &c->setup;
|
||||
}
|
||||
if (c->event.type == QB_IPC_SOCKET) {
|
||||
ow = &c->event;
|
||||
}
|
||||
ow = _event_sock_one_way_get(c);
|
||||
if (ow) {
|
||||
res = qb_ipc_us_recv_ready(ow, ms_timeout);
|
||||
if (res < 0) {
|
||||
@ -345,19 +368,14 @@ qb_ipcc_disconnect(struct qb_ipcc_connection *c)
|
||||
return;
|
||||
}
|
||||
|
||||
if (c->needs_sock_for_poll) {
|
||||
ow = &c->setup;
|
||||
}
|
||||
if (c->event.type == QB_IPC_SOCKET) {
|
||||
ow = &c->event;
|
||||
}
|
||||
ow = _event_sock_one_way_get(c);
|
||||
if (ow) {
|
||||
if (qb_ipc_us_recv_ready(ow, 0) == -ENOTCONN) {
|
||||
c->is_connected = QB_FALSE;
|
||||
}
|
||||
qb_ipcc_us_sock_close(ow->u.us.sock);
|
||||
}
|
||||
|
||||
qb_ipcc_us_sock_close(c->setup.u.us.sock);
|
||||
if (c->funcs.disconnect) {
|
||||
c->funcs.disconnect(c);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user