mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-16 06:08:16 +00:00
lxip: correct msghdr initialization
This commit is contained in:
42
repos/dde_linux/src/lib/lxip/include/msghdr.h
Normal file
42
repos/dde_linux/src/lib/lxip/include/msghdr.h
Normal 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_ */
|
@ -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;
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
Reference in New Issue
Block a user