Esempio n. 1
0
File: ipcc.c Progetto: krig/libqb
ssize_t
qb_ipcc_event_recv(struct qb_ipcc_connection * c, void *msg_pt,
		   size_t msg_len, int32_t ms_timeout)
{
	char one_byte = 1;
	int32_t res;
	ssize_t size;

	if (c == NULL) {
		return -EINVAL;
	}
	res = _check_connection_state_with(c, -EAGAIN, _event_sock_one_way_get(c),
					   ms_timeout, POLLIN);
	if (res < 0) {
		return res;
	}
	size = c->funcs.recv(&c->event, msg_pt, msg_len, ms_timeout);
	if (size > 0 && c->needs_sock_for_poll) {
		res = qb_ipc_us_recv(&c->setup, &one_byte, 1, -1);
		if (res != 1) {
			size = res;
		}
	}
	return _check_connection_state(c, size);
}
Esempio n. 2
0
File: ipcc.c Progetto: ip1981/libqb
void
qb_ipcc_disconnect(struct qb_ipcc_connection *c)
{
	struct qb_ipc_one_way *ow = NULL;
	int32_t res = 0;

	qb_util_log(LOG_DEBUG, "%s()", __func__);

	if (c == NULL) {
		return;
	}

	ow = _event_sock_one_way_get(c);
	if (ow) {
		res = qb_ipc_us_recv_ready(ow, 0);
		_check_connection_state(c, res);
		qb_ipcc_us_sock_close(ow->u.us.sock);
	}

	if (c->funcs.disconnect) {
		c->funcs.disconnect(c);
	}
	free(c->receive_buf);
	free(c);
}
Esempio n. 3
0
File: ipcc.c Progetto: ip1981/libqb
ssize_t
qb_ipcc_event_recv(struct qb_ipcc_connection * c, void *msg_pt,
		   size_t msg_len, int32_t ms_timeout)
{
	char one_byte = 1;
	int32_t res;
	ssize_t size;
	struct qb_ipc_one_way *ow = NULL;

	if (c == NULL) {
		return -EINVAL;
	}
	ow = _event_sock_one_way_get(c);
	if (ow) {
		res = qb_ipc_us_recv_ready(ow, ms_timeout);
		if (res < 0) {
			_check_connection_state(c, res);
			return res;
		}
	}
	size = c->funcs.recv(&c->event, msg_pt, msg_len, ms_timeout);
	if (size < 0) {
		_check_connection_state(c, size);
		return size;
	}
	if (c->needs_sock_for_poll) {
		res = qb_ipc_us_recv(&c->setup, &one_byte, 1, -1);
		if (res < 0) {
			_check_connection_state(c, res);
			return res;
		}
	}
	return size;
}
Esempio n. 4
0
void
qb_ipcc_disconnect(struct qb_ipcc_connection *c)
{
	struct qb_ipc_one_way *ow = NULL;

	qb_util_log(LOG_DEBUG, "%s()", __func__);

	if (c == NULL) {
		return;
	}

	ow = _event_sock_one_way_get(c);
	(void)_check_connection_state_with(c, -EAGAIN, ow, 0, POLLIN);

	if (c->funcs.disconnect) {
		c->funcs.disconnect(c);
	}
	free(c->receive_buf);
	free(c);
}