From 3041a808c3797e3c87272d71666e7b2f7c7a9f46 Mon Sep 17 00:00:00 2001 From: Natanael Copa <ncopa@alpinelinux.org> Date: Wed, 25 Jan 2017 12:43:29 +0100 Subject: [PATCH] Create socket on first sendto if family agnostic udp() was used Create socket and set family on first sendto() if udp() was created without address family. Signed-off-by: Natanael Copa <ncopa@alpinelinux.org> --- src/udp.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/udp.c b/src/udp.c index ec97252..605c195 100644 --- a/src/udp.c +++ b/src/udp.c @@ -189,6 +189,27 @@ static int meth_sendto(lua_State *L) { lua_pushstring(L, gai_strerror(err)); return 2; } + + /* create socket if on first sendto if AF_UNSPEC was set */ + if (udp->family == AF_UNSPEC && udp->sock == SOCKET_INVALID) { + struct addrinfo *ap; + const char *errstr = NULL; + for (ap = ai; ap != NULL; ap = ap->ai_next) { + errstr = inet_trycreate(&udp->sock, ap->ai_family, SOCK_DGRAM, 0); + if (errstr == NULL) { + socket_setnonblocking(&udp->sock); + udp->family = ap->ai_family; + break; + } + } + if (errstr != NULL) { + lua_pushnil(L); + lua_pushstring(L, errstr); + freeaddrinfo(ai); + return 2; + } + } + timeout_markstart(tm); err = socket_sendto(&udp->sock, data, count, &sent, ai->ai_addr, (socklen_t) ai->ai_addrlen, tm); -- 2.11.0