char cmsg[128];
int len, count, clen;
- if (mask & WL_CONNECTION_READABLE) {
- wl_buffer_put_iov(&connection->in, iov, &count);
+ if (mask & WL_CONNECTION_WRITABLE) {
+ wl_buffer_get_iov(&connection->out, iov, &count);
+
+ build_cmsg(&connection->fds_out, cmsg, &clen);
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_iov = iov;
msg.msg_iovlen = count;
msg.msg_control = cmsg;
- msg.msg_controllen = sizeof cmsg;
+ msg.msg_controllen = clen;
msg.msg_flags = 0;
do {
- len = recvmsg(connection->fd, &msg, 0);
+ len = sendmsg(connection->fd, &msg, 0);
} while (len < 0 && errno == EINTR);
if (len < 0) {
fprintf(stderr,
- "read error from connection %p: %m (%d)\n",
- connection, errno);
- return -1;
- } else if (len == 0) {
- /* FIXME: Handle this better? */
+ "write error for connection %p, fd %d: %m\n",
+ connection, connection->fd);
return -1;
}
- decode_cmsg(&connection->fds_in, &msg);
-
- connection->in.head += len;
- }
+ close_fds(&connection->fds_out);
- if (mask & WL_CONNECTION_WRITABLE) {
- wl_buffer_get_iov(&connection->out, iov, &count);
+ connection->out.tail += len;
+ if (connection->out.tail == connection->out.head)
+ connection->update(connection,
+ WL_CONNECTION_READABLE,
+ connection->data);
+ }
- build_cmsg(&connection->fds_out, cmsg, &clen);
+ if (mask & WL_CONNECTION_READABLE) {
+ wl_buffer_put_iov(&connection->in, iov, &count);
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_iov = iov;
msg.msg_iovlen = count;
msg.msg_control = cmsg;
- msg.msg_controllen = clen;
+ msg.msg_controllen = sizeof cmsg;
msg.msg_flags = 0;
do {
- len = sendmsg(connection->fd, &msg, 0);
+ len = recvmsg(connection->fd, &msg, 0);
} while (len < 0 && errno == EINTR);
if (len < 0) {
fprintf(stderr,
- "write error for connection %p, fd %d: %m\n",
- connection, connection->fd);
+ "read error from connection %p: %m (%d)\n",
+ connection, errno);
+ return -1;
+ } else if (len == 0) {
+ /* FIXME: Handle this better? */
return -1;
}
- close_fds(&connection->fds_out);
+ decode_cmsg(&connection->fds_in, &msg);
- connection->out.tail += len;
- if (connection->out.tail == connection->out.head)
- connection->update(connection,
- WL_CONNECTION_READABLE,
- connection->data);
- }
+ connection->in.head += len;
+ }
return connection->in.head - connection->in.tail;
}