connection: Write before reading connection data

dev
Benjamin Franzke 14 years ago
parent 9d708b07e4
commit ac4326884b
  1. 54
      wayland/connection.c

@ -251,68 +251,68 @@ wl_connection_data(struct wl_connection *connection, uint32_t mask)
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;
}

Loading…
Cancel
Save