70
70
int file_descriptor = socket(family, SOCK_DGRAM, 0);
71
71
if (file_descriptor == -1)
72
_module.log_fatal(_("Error creating datagram socket: %s"), strerror(errno));
73
_module.log_fatal(_("Error creating datagram socket: %s:%d"),
74
strerror(errno), errno);
74
77
set_file_descriptor(file_descriptor);
77
void datagram_provider::bind(const struct sockaddr& address,
78
socklen_t address_size)
80
void datagram_provider::create(const struct sockaddr& local,
80
create(address.sa_family);
83
create(local.sa_family);
82
int return_code = ::bind(_file_descriptor, &address, address_size);
85
int return_code = ::bind(_file_descriptor, &local, local_size);
83
86
if (return_code == -1)
85
88
if (errno == EADDRINUSE)
86
_module.log_fatal(_("Bind failed, address already in use"));
89
_module.log_fatal(_("Bind failed, local address already in use"));
88
_module.log_fatal(_("Error binding datagram socket, bind: %s"), strerror(errno));
91
_module.log_fatal(_("Error binding datagram socket, bind: %s:%d"),
92
strerror(errno), errno);
92
void datagram_provider::set_peer(const struct sockaddr& peer, socklen_t peer_size)
96
void datagram_provider::set_peer(const struct sockaddr& peer,
94
99
memcpy(_peer, &peer, peer_size);
95
100
_peer_size = peer_size;
161
166
void datagram_provider::read_ready(int)
163
if (_receive_buffer_size > 0)
165
/* Can only buffer a single packet, and we already have one */
169
_peer_size = sizeof(_peer_storage);
171
ssize_t received = ::recvfrom(_file_descriptor,
173
_receive_buffer_max_size,
168
while (_receive_buffer_size == 0)
170
_peer_size = sizeof(_peer_storage);
172
ssize_t received = ::recvfrom(_file_descriptor,
174
_receive_buffer_max_size,
181
else if (received == -1)
188
else if (errno == EINTR)
191
_module.log_error(_("Datagram receive failed: %s:%d"),
192
strerror(errno), errno);
180
197
_module.log_debug(_("Received %d bytes"), received);
182
_receive_buffer_size = static_cast<size_t>(received);
199
_receive_buffer_size = received;
184
201
_consume(receive(_receive_buffer, _receive_buffer_size, *_peer, _peer_size));
186
if (_receive_buffer_size == 0)
191
if (_receive_buffer_size != static_cast<size_t>(received))
193
/* caller must consume all or none of the receive buffer */
195
_module.log_fatal(_("Caller consumed partial datagram receive buffer"));
210
_module.log_error(_("Datagram receive failed: %s"), strerror(errno));
215
_module.log_debug(_("Received %d bytes"), received);
221
205
void datagram_provider::write_ready(int)