Skip to content
Snippets Groups Projects
Commit de41971a authored by Francois Berder's avatar Francois Berder
Browse files

posix: sockets: Fix return value of sendto and recvfrom


The return value of these functions was not always correct
in case of errors: they were not returning -1 and setting
errno.

Signed-off-by: default avatarFrancois Berder <francois.berder@imgtec.com>
parent fc6b7f05
Branches
No related tags found
No related merge requests found
......@@ -794,26 +794,36 @@ ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags,
#ifdef MODULE_SOCK_IP
case SOCK_RAW:
/* TODO: apply configured timeout */
res = sock_ip_recv(&s->sock->raw, buffer, length, SOCK_NO_TIMEOUT,
(sock_ip_ep_t *)&ep);
if ((res = sock_ip_recv(&s->sock->raw, buffer, length, SOCK_NO_TIMEOUT,
(sock_ip_ep_t *)&ep) < 0) {
errno = -res;
res = -1;
}
break;
#endif
#ifdef MODULE_SOCK_TCP
case SOCK_STREAM:
/* TODO: apply configured timeout */
res = sock_tcp_read(&s->sock->tcp.sock, buffer, length,
SOCK_NO_TIMEOUT);
if ((res = sock_tcp_read(&s->sock->tcp.sock, buffer, length,
SOCK_NO_TIMEOUT)) < 0) {
errno = -res;
res = -1;
}
break;
#endif
#ifdef MODULE_SOCK_UDP
case SOCK_DGRAM:
/* TODO: apply configured timeout */
res = sock_udp_recv(&s->sock->udp, buffer, length, SOCK_NO_TIMEOUT,
&ep);
if ((res = sock_udp_recv(&s->sock->udp, buffer, length, 0,
&ep)) < 0) {
errno = -res;
res = -1;
}
break;
#endif
default:
res = -EOPNOTSUPP;
errno = EOPNOTSUPP;
res = -1;
break;
}
if ((res == 0) && (address != NULL) && (address_len != 0)) {
......@@ -868,33 +878,45 @@ ssize_t sendto(int socket, const void *buffer, size_t length, int flags,
}
}
#if defined(MODULE_SOCK_IP) || defined(MODULE_SOCK_UDP)
_sockaddr_to_ep(address, address_len, &ep);
if ((res = _sockaddr_to_ep(address, address_len, &ep)) < 0)
return res;
#endif
switch (s->type) {
#ifdef MODULE_SOCK_IP
case SOCK_RAW:
res = sock_ip_send(&s->sock->raw, buffer, length,
s->protocol, (sock_ip_ep_t *)&ep);
if ((res = sock_ip_send(&s->sock->raw, buffer, length,
s->protocol, (sock_ip_ep_t *)&ep)) < 0) {
errno = -res;
res = -1;
}
break;
#endif
#ifdef MODULE_SOCK_TCP
case SOCK_STREAM:
if (address == NULL) {
(void)address_len;
res = sock_tcp_write(&s->sock->tcp.sock, buffer, length);
if ((res = sock_tcp_write(&s->sock->tcp.sock, buffer, length)) < 0) {
errno = -res;
res = -1;
}
}
else {
res = EISCONN;
res = -1;
errno = EISCONN;
}
break;
#endif
#ifdef MODULE_SOCK_UDP
case SOCK_DGRAM:
res = sock_udp_send(&s->sock->udp, buffer, length, &ep);
if ((res = sock_udp_send(&s->sock->udp, buffer, length, &ep)) < 0) {
errno = -res;
res = -1;
}
break;
#endif
default:
res = -EOPNOTSUPP;
res = -1;
errno = EOPNOTSUPP;
break;
}
return res;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment