};
};
+/*
+ * rsocket states are ordered as passive, connecting, connected, disconnected.
+ */
enum rs_state {
rs_init,
rs_bound,
rs_resolving_route,
rs_connecting,
rs_accepting,
+ rs_connect_error,
rs_connected,
rs_disconnected,
- rs_connect_error,
rs_error
};
int ret;
rs = idm_at(&idm, socket);
- if (rs->state != rs_connected &&
- (rs->state == rs_resolving_addr || rs->state == rs_resolving_route ||
- rs->state == rs_connecting || rs->state == rs_accepting)) {
+ if (rs->state < rs_connected) {
ret = rs_do_connect(rs);
if (ret) {
if (errno == EINPROGRESS)
int ret = 0;
rs = idm_at(&idm, socket);
- if (rs->state != rs_connected) {
+ if (rs->state < rs_connected) {
ret = rs_do_connect(rs);
if (ret) {
if (errno == EINPROGRESS)
int i, ret = 0;
rs = idm_at(&idm, socket);
- if (rs->state != rs_connected) {
+ if (rs->state < rs_connected) {
ret = rs_do_connect(rs);
if (ret) {
if (errno == EINPROGRESS)
revents |= POLLOUT;
if (rs->state == rs_disconnected)
revents |= POLLHUP;
- if (rs->state == rs_error)
+ else if (rs->state == rs_error)
revents |= POLLERR;
return revents;
if (fds[i].revents)
return 1;
- switch (rs->state) {
- case rs_connected:
- case rs_disconnected:
- case rs_error:
+ if (rs->state >= rs_connected)
rfds[i].fd = rs->cm_id->recv_cq_channel->fd;
- break;
- default:
+ else
rfds[i].fd = rs->cm_id->channel->fd;
- break;
- }
+
rfds[i].events = POLLIN;
} else {
rfds[i].fd = fds[i].fd;