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: Francois Berder <francois.berder@imgtec.com>
This commit is contained in:
Francois Berder 2017-03-03 14:29:47 +00:00
parent fc6b7f0575
commit de41971aab

View File

@ -794,26 +794,36 @@ ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags,
#ifdef MODULE_SOCK_IP #ifdef MODULE_SOCK_IP
case SOCK_RAW: case SOCK_RAW:
/* TODO: apply configured timeout */ /* TODO: apply configured timeout */
res = sock_ip_recv(&s->sock->raw, buffer, length, SOCK_NO_TIMEOUT, if ((res = sock_ip_recv(&s->sock->raw, buffer, length, SOCK_NO_TIMEOUT,
(sock_ip_ep_t *)&ep); (sock_ip_ep_t *)&ep) < 0) {
errno = -res;
res = -1;
}
break; break;
#endif #endif
#ifdef MODULE_SOCK_TCP #ifdef MODULE_SOCK_TCP
case SOCK_STREAM: case SOCK_STREAM:
/* TODO: apply configured timeout */ /* TODO: apply configured timeout */
res = sock_tcp_read(&s->sock->tcp.sock, buffer, length, if ((res = sock_tcp_read(&s->sock->tcp.sock, buffer, length,
SOCK_NO_TIMEOUT); SOCK_NO_TIMEOUT)) < 0) {
errno = -res;
res = -1;
}
break; break;
#endif #endif
#ifdef MODULE_SOCK_UDP #ifdef MODULE_SOCK_UDP
case SOCK_DGRAM: case SOCK_DGRAM:
/* TODO: apply configured timeout */ /* TODO: apply configured timeout */
res = sock_udp_recv(&s->sock->udp, buffer, length, SOCK_NO_TIMEOUT, if ((res = sock_udp_recv(&s->sock->udp, buffer, length, 0,
&ep); &ep)) < 0) {
errno = -res;
res = -1;
}
break; break;
#endif #endif
default: default:
res = -EOPNOTSUPP; errno = EOPNOTSUPP;
res = -1;
break; break;
} }
if ((res == 0) && (address != NULL) && (address_len != 0)) { 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) #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 #endif
switch (s->type) { switch (s->type) {
#ifdef MODULE_SOCK_IP #ifdef MODULE_SOCK_IP
case SOCK_RAW: case SOCK_RAW:
res = sock_ip_send(&s->sock->raw, buffer, length, if ((res = sock_ip_send(&s->sock->raw, buffer, length,
s->protocol, (sock_ip_ep_t *)&ep); s->protocol, (sock_ip_ep_t *)&ep)) < 0) {
errno = -res;
res = -1;
}
break; break;
#endif #endif
#ifdef MODULE_SOCK_TCP #ifdef MODULE_SOCK_TCP
case SOCK_STREAM: case SOCK_STREAM:
if (address == NULL) { if (address == NULL) {
(void)address_len; (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 { else {
res = EISCONN; res = -1;
errno = EISCONN;
} }
break; break;
#endif #endif
#ifdef MODULE_SOCK_UDP #ifdef MODULE_SOCK_UDP
case SOCK_DGRAM: 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; break;
#endif #endif
default: default:
res = -EOPNOTSUPP; res = -1;
errno = EOPNOTSUPP;
break; break;
} }
return res; return res;