lxip: correct msghdr initialization

This commit is contained in:
Christian Helmuth
2017-05-29 13:06:16 +02:00
parent 6d941ede1c
commit a431657851
3 changed files with 90 additions and 99 deletions

View File

@ -0,0 +1,42 @@
/*
* \brief Complete initialization of msghdr
* \author Christian Helmuth
* \date 2017-05-29
*/
/*
* Copyright (C) 202017 Genode Labs GmbH
*
* This file is distributed under the terms of the GNU General Public License
* version 2.
*/
#ifndef _MSGHDR_H_
#define _MSGHDR_H_
#include <lx_emul/extern_c_begin.h>
#include <linux/socket.h>
#include <lx_emul/extern_c_end.h>
static inline msghdr create_msghdr(void *name, int namelen, size_t datalen,
struct iovec *iov)
{
msghdr msg;
msg.msg_name = name;
msg.msg_namelen = namelen;
msg.msg_iter.type = 0;
msg.msg_iter.iov_offset = 0;
msg.msg_iter.count = datalen;
msg.msg_iter.iov = iov;
msg.msg_iter.nr_segs = 1;
msg.msg_control = nullptr;
msg.msg_controllen = 0;
msg.msg_flags = 0;
msg.msg_iocb = nullptr;
return msg;
}
#endif /* _MSGHDR_H_ */

View File

@ -31,6 +31,7 @@ static const bool verbose = false;
namespace Linux { namespace Linux {
#include <lx_emul.h> #include <lx_emul.h>
#include <msghdr.h>
#include <lx_emul/extern_c_begin.h> #include <lx_emul/extern_c_begin.h>
#include <linux/socket.h> #include <linux/socket.h>
@ -299,20 +300,11 @@ class Net::Socketcall : public Lxip::Socketcall,
void _do_recv() void _do_recv()
{ {
using namespace Linux; using namespace Linux;
struct msghdr msg;
struct iovec iov;
msg.msg_control = nullptr; iovec iov { _call.msg.buf, _call.msg.len };
msg.msg_controllen = 0;
msg.msg_iter.iov = &iov;
msg.msg_iter.nr_segs = 1;
msg.msg_iter.count = _call.msg.len;
iov.iov_len = _call.msg.len; msghdr msg = create_msghdr(_call.addr_len ? &_call.addr : nullptr,
iov.iov_base = _call.msg.buf; _call.addr_len, _call.msg.len, &iov);
msg.msg_name = _call.addr_len ? &_call.addr : 0;
msg.msg_namelen = _call.addr_len;
msg.msg_flags = 0;
if (_call.handle.non_block) if (_call.handle.non_block)
msg.msg_flags |= MSG_DONTWAIT; msg.msg_flags |= MSG_DONTWAIT;
@ -331,25 +323,17 @@ class Net::Socketcall : public Lxip::Socketcall,
void _do_send() void _do_send()
{ {
using namespace Linux; using namespace Linux;
struct msghdr msg;
struct iovec iov;
_result.len = socket_check_state(call_socket()); _result.len = socket_check_state(call_socket());
if (_result.len < 0) if (_result.len < 0)
return; return;
msg.msg_control = nullptr; iovec iov { _call.msg.buf, _call.msg.len };
msg.msg_controllen = 0;
msg.msg_iter.iov = &iov; msghdr msg = create_msghdr(_call.addr_len ? &_call.addr : nullptr,
msg.msg_iter.nr_segs = 1; _call.addr_len, _call.msg.len, &iov);
msg.msg_iter.count = _call.msg.len;
iov.iov_len = _call.msg.len;
iov.iov_base = _call.msg.buf;
msg.msg_name = _call.addr_len ? &_call.addr : 0;
msg.msg_namelen = _call.addr_len;
msg.msg_flags = _call.msg.flags; msg.msg_flags = _call.msg.flags;
if (_call.handle.non_block) if (_call.handle.non_block)
msg.msg_flags |= MSG_DONTWAIT; msg.msg_flags |= MSG_DONTWAIT;

View File

@ -35,6 +35,7 @@
namespace Linux { namespace Linux {
#include <lx_emul.h> #include <lx_emul.h>
#include <msghdr.h>
#include <lx_emul/extern_c_begin.h> #include <lx_emul/extern_c_begin.h>
#include <linux/socket.h> #include <linux/socket.h>
@ -347,22 +348,10 @@ class Vfs::Lxip_data_file : public Vfs::Lxip_file
{ {
using namespace Linux; using namespace Linux;
msghdr msg; iovec iov { const_cast<char *>(src), len };
iovec iov;
msg.msg_name = &_parent.remote_addr(); msghdr msg = create_msghdr(&_parent.remote_addr(),
msg.msg_namelen = sizeof(sockaddr_in); sizeof(sockaddr_in), len, &iov);
msg.msg_iter.iov_offset = 0;
msg.msg_iter.count = len;
msg.msg_iter.iov = &iov;
msg.msg_iter.nr_segs = 1;
msg.msg_control = nullptr;
msg.msg_controllen = 0;
msg.msg_flags = 0;
msg.msg_iocb = nullptr;
iov.iov_base = const_cast<char *>(src);
iov.iov_len = len;
return _sock.ops->sendmsg(&_sock, &msg, len); return _sock.ops->sendmsg(&_sock, &msg, len);
} }
@ -372,22 +361,9 @@ class Vfs::Lxip_data_file : public Vfs::Lxip_file
{ {
using namespace Linux; using namespace Linux;
msghdr msg; iovec iov { dst, len };
iovec iov;
msg.msg_name = nullptr; msghdr msg = create_msghdr(nullptr, 0, len, &iov);
msg.msg_namelen = 0;
msg.msg_iter.iov_offset = 0;
msg.msg_iter.count = len;
msg.msg_iter.iov = &iov;
msg.msg_iter.nr_segs = 1;
msg.msg_control = nullptr;
msg.msg_controllen = 0;
msg.msg_flags = 0;
msg.msg_iocb = nullptr;
iov.iov_base = dst;
iov.iov_len = len;
Lxip::ssize_t ret = _sock.ops->recvmsg(&_sock, &msg, len, MSG_DONTWAIT); Lxip::ssize_t ret = _sock.ops->recvmsg(&_sock, &msg, len, MSG_DONTWAIT);
if (ret == -EAGAIN) if (ret == -EAGAIN)
@ -682,23 +658,12 @@ class Vfs::Lxip_remote_file : public Vfs::Lxip_file
case Lxip::Protocol_dir::TYPE_DGRAM: case Lxip::Protocol_dir::TYPE_DGRAM:
{ {
/* peek the sender address of the next packet */ /* peek the sender address of the next packet */
msghdr msg;
iovec iov;
msg.msg_name = addr;
msg.msg_namelen = sizeof(addr_storage);
msg.msg_iter.type = 0;
msg.msg_iter.iov_offset = 0;
msg.msg_iter.count = sizeof(_content_buffer);
msg.msg_iter.iov = &iov;
msg.msg_iter.nr_segs = 1;
msg.msg_control = nullptr;
msg.msg_controllen = 0;
msg.msg_iocb = nullptr;
/* buffer not used */ /* buffer not used */
iov.iov_base = _content_buffer; iovec iov { _content_buffer, sizeof(_content_buffer) };
iov.iov_len = sizeof(_content_buffer);
msghdr msg = create_msghdr(addr, sizeof(addr_storage),
sizeof(_content_buffer), &iov);
int const res = _sock.ops->recvmsg(&_sock, &msg, 0, MSG_DONTWAIT|MSG_PEEK); int const res = _sock.ops->recvmsg(&_sock, &msg, 0, MSG_DONTWAIT|MSG_PEEK);
if (res == -EAGAIN) throw Would_block(); if (res == -EAGAIN) throw Would_block();