diff --git a/include/evio.h b/include/evio.h index 47f7be9f3f62222733b730a75920e7e83a188d8b..5e609e67623cc5291b8401ec32f41eb7ab37d5eb 100644 --- a/include/evio.h +++ b/include/evio.h @@ -150,6 +150,6 @@ void evio_bind_addrinfo(struct ev_io *coio, struct addrinfo *ai); int -evio_pton(const char *addr, const char *port, char *sa, socklen_t *len); +evio_pton(const char *addr, const char *port, struct sockaddr_storage *sa, socklen_t *salen); #endif /* TARANTOOL_EVIO_H_INCLUDED */ diff --git a/src/evio.m b/src/evio.m index aeb9a33681073a7cc6460b68e818bc2d3c516a9a..c50880b0c7e2d38c46fc6cd5205af9e3585631ab 100644 --- a/src/evio.m +++ b/src/evio.m @@ -43,13 +43,13 @@ * sa buf must be sizeo of sizeof(sockaddr_in6). */ int -evio_pton(const char *addr, const char *port, char *sa, socklen_t *len) { +evio_pton(const char *addr, const char *port, struct sockaddr_storage *sa, socklen_t *salen) { struct sockaddr_in *v4 = (struct sockaddr_in*)sa; int rc = inet_pton(AF_INET, addr, &v4->sin_addr); if (rc) { v4->sin_family = AF_INET; v4->sin_port = htons(atoi(port)); - *len = sizeof(struct sockaddr_in); + *salen = sizeof(struct sockaddr_in); return AF_INET; } struct sockaddr_in6 *v6 = (struct sockaddr_in6*)sa; @@ -57,7 +57,7 @@ evio_pton(const char *addr, const char *port, char *sa, socklen_t *len) { if (rc) { v6->sin6_family = AF_INET6; v6->sin6_port = htons(atoi(port)); - *len = sizeof(struct sockaddr_in6); + *salen = sizeof(struct sockaddr_in6); return AF_INET6; } return -1; diff --git a/src/lua/lua_socket.m b/src/lua/lua_socket.m index 126eef192374306c6875a179804e080334386198..e49e7b6397f1c3bdfdfcfb5fe0e31e87b2834728 100644 --- a/src/lua/lua_socket.m +++ b/src/lua/lua_socket.m @@ -710,13 +710,13 @@ lbox_socket_accept(struct lua_State *L) timeout = luaL_checknumber(L, 2); bio_clearerr(s); - struct sockaddr_in addr; + struct sockaddr_storage addr; /* push client socket */ bio_pushsocket(L, SOCK_STREAM); struct bio_socket *client = lua_touserdata(L, -1); @try { - client->coio.fd = coio_accept(&s->coio, &addr, sizeof(addr), - timeout); + client->coio.fd = coio_accept(&s->coio, (struct sockaddr_in*)&addr, + sizeof(addr), timeout); } @catch (SocketError *e) { return bio_pusherror(L, s, errno); } @@ -763,20 +763,20 @@ lbox_socket_sendto(struct lua_State *L) ev_tstamp start, delay; evio_timeout_init(&start, &delay, timeout); - char addrbuf[sizeof(struct sockaddr_in6)]; - assert(sizeof(addrbuf) > sizeof(struct sockaddr_in)); + struct sockaddr_storage ss; + assert(sizeof(ss) > sizeof(struct sockaddr_in6)); struct addrinfo *a = NULL; - struct sockaddr_in *addr = (struct sockaddr_in*)addrbuf; + struct sockaddr *addr = (struct sockaddr*)&ss; socklen_t addrlen; - if (evio_pton(host, port, addrbuf, &addrlen) == -1) { + if (evio_pton(host, port, &ss, &addrlen) == -1) { evio_timeout_init(&start, &delay, timeout); /* try to resolve a hostname */ struct addrinfo *a = coeio_resolve(s->socktype, host, port, delay); if (a == NULL) return bio_pushsenderror(L, s, 0, errno); evio_timeout_update(start, &delay); - addr = (struct sockaddr_in *) a->ai_addr; + addr = (struct sockaddr *) a->ai_addr; addrlen = a->ai_addrlen; } @@ -784,9 +784,9 @@ lbox_socket_sendto(struct lua_State *L) @try { /* maybe init the socket */ if (! evio_is_active(&s->coio)) - evio_socket(&s->coio, addr->sin_family, s->socktype, 0); + evio_socket(&s->coio, addr->sa_family, s->socktype, 0); nwr = coio_sendto_timeout(&s->coio, buf, buf_size, 0, - addr, addrlen, delay); + (struct sockaddr_in*)addr, addrlen, delay); } @catch (SocketError *e) { /* case #2-3: error or timeout */ return bio_pushsenderror(L, s, 0, errno); @@ -827,12 +827,13 @@ lbox_socket_recvfrom(struct lua_State *L) if (s->iob == NULL) bio_initbuf(s); - struct sockaddr_in addr; + struct sockaddr_storage addr; struct ibuf *in = &s->iob->in; size_t nrd; @try { ibuf_reserve(in, buf_size); - nrd = coio_recvfrom_timeout(&s->coio, in->pos, buf_size, 0, &addr, + nrd = coio_recvfrom_timeout(&s->coio, in->pos, buf_size, 0, + (struct sockaddr_in*)&addr, sizeof(addr), timeout); } @catch (SocketError *e) { return bio_pushrecverror(L, s, errno);