aboutsummaryrefslogtreecommitdiffstats
path: root/main/lua-socket/0001-Create-socket-on-first-sendto-if-family-agnostic-udp.patch
blob: 61bae6fbf4859e98a0545f559030d6054e3ded73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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