From aee6c1f72f1c61a524dc91c1663c79be1cb6fc57 Mon Sep 17 00:00:00 2001 From: goldsimon Date: Tue, 5 Jun 2007 18:46:10 +0000 Subject: [PATCH] Corrected setsockopt for LWIP_IGMP=1 (did not compile & errors were not returned) --- src/api/sockets.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/api/sockets.c b/src/api/sockets.c index b74ba9dc..2d8fe802 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -77,6 +77,7 @@ struct lwip_setgetsockopt_data { int optname; void *optval; socklen_t *optlen; + err_t err; }; static struct lwip_socket sockets[NUM_SOCKETS]; @@ -1080,8 +1081,11 @@ int lwip_getsockopt(int s, int level, int optname, void *optval, socklen_t *optl data.optname = optname; data.optval = optval; data.optlen = optlen; + data.err = err; tcpip_callback(lwip_getsockopt_internal, &data); sys_arch_mbox_fetch(sock->conn->mbox, NULL, 0); + /* maybe lwip_getsockopt_internal has changed err */ + err = data.err; sock_set_errno(sock, err); return err ? -1 : 0; @@ -1293,6 +1297,9 @@ int lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t if (optlen < sizeof(struct ip_mreq)) { err = EINVAL; } + if ((sock->conn->type == NETCONN_TCP) || (sock->conn->type == NETCONN_RAW)) { + err = EAFNOSUPPORT; + } break; #endif /* LWIP_IGMP */ default: @@ -1350,8 +1357,11 @@ int lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t data.optname = optname; data.optval = (void*)optval; data.optlen = &optlen; + data.err = err; tcpip_callback(lwip_setsockopt_internal, &data); sys_arch_mbox_fetch(sock->conn->mbox, NULL, 0); + /* maybe lwip_setsockopt_internal has changed err */ + err = data.err; sock_set_errno(sock, err); return err ? -1 : 0; @@ -1431,19 +1441,16 @@ static void lwip_setsockopt_internal(void *arg) break; case IP_ADD_MEMBERSHIP: case IP_DROP_MEMBERSHIP: - /* If this is a TCP or a RAW socket, ignore these options. */ - if ((sock->conn->type == NETCONN_TCP) || (sock->conn->type == NETCONN_RAW)) { - err = EAFNOSUPPORT; - } else { + { + /* If this is a TCP or a RAW socket, ignore these options. */ struct ip_mreq *imr = (struct ip_mreq *)optval; - err_t err; if(optname == IP_ADD_MEMBERSHIP){ - err = igmp_joingroup(netif_default, imr); + data->err = igmp_joingroup(netif_default, (struct ip_addr*)&(imr->imr_multiaddr.s_addr)); } else { - err = igmp_leavegroup(netif_default, imr->imr_multiaddr.s_addr); + data->err = igmp_leavegroup(netif_default, (struct ip_addr*)&(imr->imr_multiaddr.s_addr)); } - if(err < 0) { - err = EADDRNOTAVAIL; + if(data->err != ERR_OK) { + data->err = EADDRNOTAVAIL; } } break;