kernel/fs: Implement readv/writev for sockets.
This is important for datagram sockets as we need to preserve message boundaries. For stream sockets it's merely an optimization.
This commit is contained in:
@@ -218,6 +218,28 @@ socket_write(struct file_descriptor *descriptor, off_t pos, const void *buffer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
socket_readv(struct file_descriptor *descriptor, off_t pos,
|
||||||
|
const struct iovec *vecs, int count)
|
||||||
|
{
|
||||||
|
struct msghdr message = {};
|
||||||
|
message.msg_iov = (struct iovec*)vecs;
|
||||||
|
message.msg_iovlen = count;
|
||||||
|
return sStackInterface->recvmsg((net_socket*)descriptor->cookie, &message, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
socket_writev(struct file_descriptor *descriptor, off_t pos,
|
||||||
|
const struct iovec *vecs, int count)
|
||||||
|
{
|
||||||
|
struct msghdr message = {};
|
||||||
|
message.msg_iov = (struct iovec*)vecs;
|
||||||
|
message.msg_iovlen = count;
|
||||||
|
return sStackInterface->sendmsg((net_socket*)descriptor->cookie, &message, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
socket_ioctl(struct file_descriptor *descriptor, ulong op, void *buffer,
|
socket_ioctl(struct file_descriptor *descriptor, ulong op, void *buffer,
|
||||||
size_t length)
|
size_t length)
|
||||||
@@ -300,7 +322,8 @@ static struct fd_ops sSocketFDOps = {
|
|||||||
&socket_free,
|
&socket_free,
|
||||||
&socket_read,
|
&socket_read,
|
||||||
&socket_write,
|
&socket_write,
|
||||||
NULL, NULL, // readv(), writev()
|
&socket_readv,
|
||||||
|
&socket_writev,
|
||||||
NULL, // fd_seek
|
NULL, // fd_seek
|
||||||
&socket_ioctl,
|
&socket_ioctl,
|
||||||
&socket_set_flags,
|
&socket_set_flags,
|
||||||
|
|||||||
Reference in New Issue
Block a user